Probleem met het uitvoeren van scripts met PowerShell

Hallo allemaal, ik heb hulp nodig om de API's te begrijpen, ik heb inderdaad een leuke kleine code gemaakt, maar deze wil niet starten. Hier is de foutmelding:

Hier is het script:

$function Get-SWFileProperties {
param(
[tekenreeks]$directoryPath
)

if (-not (Get-Module -ListAvailable -Name ImportExcel)) {
    Install-Module -Name ImportExcel -Scope CurrentUser -AllowClobber -Force
}

$excelFile = Join-Path -Path $directoryPath -ChildPath "SolidWorks_Properties.xlsx"
$SolidWorks = New-Object -ComObject SldWorks.Application
$SolidWorks.Visible = $false
$swDocumentTypes = New-Object -ComObject SolidWorks.Interop.swconst.swDocumentTypes_e
$swOpenDocOptions = New-Object -ComObject SolidWorks.Interop.swconst.swOpenDocOptions_e
$swOpenDocOptions_Silent = $swOpenDocOptions.swOpenDocOptions_Silent
$data = @()

$files = Get-ChildItem -Path $directoryPath -Include *.sldprt, *.slddrw, *.sldasm -Recurse
$totalFiles = $files.Count
$processedFiles = 0

foreach ($file in $files) {
    $filePath = $file.FullName
    $fileType = $null
    switch ($file.Extension.ToLower()) {
        ".sldprt" { $fileType = $swDocumentTypes.swDocPART }
        ".sldasm" { $fileType = $swDocumentTypes.swDocASSEMBLY }
        ".slddrw" { $fileType = $swDocumentTypes.swDocDRAWING }
    }
    $doc = $SolidWorks.OpenDoc6($filePath, $fileType, $swOpenDocOptions_Silent, "", [ref] 0, [ref] 0)
    if ($doc -ne $null) {
        $customPropMgr = $doc.Extension.CustomPropertyManager("")
        $properties = @{}
        $names = @()
        $customPropMgr.GetNames([ref]$names)
        foreach ($name in $names) {
            $value = $null
            $customPropMgr.Get4($name, $false, [ref]$value, [ref]$null)
            $properties[$name] = $value
        }
        $properties['FilePath'] = $filePath
        $data += New-Object PSObject -Property $properties
        $SolidWorks.CloseDoc($doc.GetTitle())
    }
    $processedFiles++
    Write-Progress -Activity "Processing SolidWorks Files" -Status "$processedFiles out of $totalFiles processed" -PercentComplete (($processedFiles / $totalFiles) * 100)
}

$data | Export-Excel -Path $excelFile -WorksheetName "Properties" -AutoSize -TableName "SWProperties"
$SolidWorks.ExitApp()
Write-Progress -Activity "Processing SolidWorks Files" -Completed
Write-Host "Processing complete. $processedFiles files processed."

}

Voorbeeld van gebruik

Get-SWFileProperties -directoryPath " F:\Machine_3D\BDD "

Dit is wat hij in detail doet:

  1. Controle van de ImportExcel-module: Het script begint met het controleren of de ImportExcel PowerShell-module beschikbaar is. Deze module is nodig om Excel-bestanden te maken en te manipuleren zonder dat Excel op de computer hoeft te zijn geïnstalleerd. Als de module niet wordt gevonden, probeert deze te installeren. Deze module wordt gebruikt om de verzamelde gegevens te exporteren naar een Excel-bestand.
  2. Voorbereiding van het Excel-uitvoerbestand: Een Excel-bestandspad (SolidWorks_Properties.xlsx) wordt geconstrueerd met behulp van het mappad dat als parameter is opgegeven. Dit bestand wordt gebruikt om de eigenschappen op te slaan die uit de SolidWorks-bestanden zijn geëxtraheerd.
  3. Initialisatie van SolidWorks-toepassing: Het script maakt een exemplaar van de SolidWorks-toepassing met behulp van COM Automation (Component Object Model). Dit exemplaar wordt gebruikt om SolidWorks-bestanden te openen en hun eigenschappen te extraheren. De SolidWorks-instantie is geconfigureerd om niet-zichtbaar te zijn ($SolidWorks.Visible = $false), waardoor het script op de achtergrond kan worden uitgevoerd zonder de SolidWorks-gebruikersinterface te openen.
  4. SolidWorks File Browsing: Het script zoekt in de opgegeven map naar alle bestanden met extensies. sldprt (onderdelen), .slddrw (tekeningen) en .sldasm (samenstellingen), inclusief alle submappen (optie -Recurse).
  5. Eigenschappen uitpakken en opslaan: Voor elk gevonden bestand bepaalt het script het type (onderdeel, tekening of assemblage) en gebruikt het SolidWorks om het stil te openen. Vervolgens worden de aangepaste eigenschappen uit het geopende bestand geëxtraheerd met behulp van de CustomPropertyManager. Eigenschapsnamen en -waarden worden opgeslagen in een $data object.
  6. De gegevens exporteren naar Excel: Na verwerking van alle bestanden worden de verzamelde gegevens geëxporteerd naar het Excel-bestand dat in stap 2 is voorbereid, met behulp van de module ImportExcel. Elk item bevat het pad van het bestand en de aangepaste eigenschappen.
  7. Opschonen: Aan het einde van de uitvoering wordt de SolidWorks-toepassing gesloten ($SolidWorks.ExitApp()) en geeft het script een bericht weer dat het aantal verwerkte bestanden aangeeft.

Heb je enig idee waar het probleem vandaan zou kunnen komen?

Je moet in de debug-modus kijken waar het probleem precies vandaan komt.
Waar codeer je op, Visual Studio Code?

Hallo

Zie misschien dit onderwerp: Fout bij het uitvoeren van een PowerShell-script - Microsoft Q&A
Omdat SW in 64 bits is, kunt u op dit niveau een probleem hebben (als de Excel-invoegtoepassing in 32bits is).
Bovendien vind ik het moeilijk om het feit te begrijpen dat ik SW heb zonder Excel, SW vertrouwt op Excel voor sommige functies, dus in theorie heb je de software op het werkstation nodig.

1 like

Hallo

De code die ik voor de functie Get-SWFileProperties heb opgegeven, maakt gebruik van de PowerShell-module ImportExcel om gegevens naar een Excel-bestand te exporteren. Deze module werkt ongeacht de versie van Excel die op mijn computer is geïnstalleerd (32-bits of 64-bits), omdat deze zelf niet rechtstreeks Excel gebruikt. In plaats daarvan manipuleert het Excel-bestanden rechtstreeks door .NET-bibliotheken te gebruiken om bestanden in Excel-formaat te lezen en te schrijven.

Ik heb geen Excel nodig om Excel op mijn computer te installeren om de module ImportExcel te laten werken. Het is gebaseerd op EPPlus, een .NET-bibliotheek waarmee ik Excel-bestanden (.xlsx) kan maken en manipuleren zonder dat ik Excel nodig heb. Dit betekent dat mijn script zal werken, ongeacht de geïnstalleerde versie van Excel, en of Excel nu in 32-bit of 64-bit is, heeft geen invloed op de uitvoering van mijn script.

Als je zin hebt, hoef je alleen maar het repertoire Get-SWFileProperties -directoryPath "F:\Machine_3D\BDD" te veranderen om het uit te proberen. Kijk of het aan uw kant werkt.

Met dit script wordt geprobeerd een exemplaar van het SolidWorks COM-onderdeel te maken met behulp New-Object -ComObjectvan . Als dit lukt, wordt een bericht weergegeven dat aangeeft dat de SolidWorks COM-componenten beschikbaar zijn. Anders wordt een bericht weergegeven dat dit niet het geval is:

De beschikbaarheid van SolidWorks COM-componenten controleren

De naam van de SolidWorks COM-component instellen

$componentName = " SldWorks.Toepassing "

Poging om een exemplaar van het SolidWorks COM-onderdeel te maken

probeer {
# Een instantie van de COM-component van SolidWorks maken
$solidWorks = Nieuw-object -ComObject $componentName -ErrorAction Stop
Write-Host " SolidWorks COM-componenten zijn beschikbaar op dit systeem." 
} vangst {
Write-Host " SolidWorks COM-componenten zijn niet beschikbaar op dit systeem." 
}

Dit is wat het retourneert:

SolidWorks COM-componenten zijn toegankelijk.
Er is een fout opgetreden bij het maken van een SolidWorks-exemplaar:
Artikel niet gevonden. (HRESULT-uitzondering: 0x8002802B (TYPE_E_ELEMENTNOTFOUND))

Het is dus een communicatie pb