Problem bei der Skriptausführung mit PowerShell

Hallo zusammen, ich brauche Hilfe, um die APIs zu verstehen, in der Tat habe ich einen netten kleinen Code erstellt, aber er will nicht starten. Hier ist die Fehlermeldung:

Hier ist das Skript:

$function Get-SWFileProperties {
param(
[Zeichenfolge]$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."

}

Anwendungsbeispiel

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

Hier ist, was er im Detail tut:

  1. Überprüfung des ImportExcel-Moduls: Das Skript beginnt mit der Überprüfung, ob das PowerShell-Modul ImportExcel verfügbar ist. Dieses Modul ist erforderlich, um Excel-Dateien zu erstellen und zu bearbeiten, ohne dass Excel auf dem Gerät installiert sein muss. Wenn das Modul nicht gefunden wird, wird versucht, es zu installieren. Dieses Modul wird verwendet, um die gesammelten Daten in eine Excel-Datei zu exportieren.
  2. Vorbereiten der Excel-Ausgabedatei: Ein Excel-Dateipfad (SolidWorks_Properties.xlsx) wird mit dem als Parameter angegebenen Ordnerpfad erstellt. Diese Datei wird verwendet, um die Eigenschaften zu speichern, die aus den SolidWorks Dateien extrahiert wurden.
  3. Initialisierung der SolidWorks Anwendung: Das Skript erstellt eine Instanz der SolidWorks Anwendung mithilfe der COM-Automatisierung (Component Object Model). Diese Instanz wird verwendet, um SolidWorks Dateien zu öffnen und ihre Eigenschaften zu extrahieren. Die SolidWorks Instanz ist so konfiguriert, dass sie nicht sichtbar ist ($SolidWorks.Visible = $false), wodurch das Skript im Hintergrund ausgeführt werden kann, ohne die SolidWorks Benutzeroberfläche zu öffnen.
  4. Durchsuchen von SolidWorks Dateien: Das Skript durchsucht den angegebenen Ordner nach allen Dateien mit Erweiterungen. sldprt (Teile), .slddrw (Zeichnungen) und .sldasm (Baugruppen), einschließlich aller Unterordner (Option -Recurse).
  5. Extrahieren und Speichern von Eigenschaften: Für jede gefundene Datei bestimmt das Skript ihren Typ (Teil, Zeichnung oder Baugruppe) und verwendet SolidWorks, um sie im Hintergrund zu öffnen. Anschließend werden die benutzerdefinierten Eigenschaften mithilfe des CustomPropertyManager aus der geöffneten Datei extrahiert. Eigenschaftsnamen und -werte werden in einem $data Objekt gespeichert.
  6. Exportieren der Daten nach Excel: Nach der Verarbeitung aller Dateien werden die gesammelten Daten mit dem ImportExcel-Modul in die Excel-Datei exportiert, die in Schritt 2 vorbereitet wurde. Jeder Eintrag enthält den Pfad der Datei und ihre benutzerdefinierten Eigenschaften.
  7. Bereinigung: Am Ende des Laufs wird die SolidWorks Anwendung geschlossen ($SolidWorks.ExitApp()), und das Skript zeigt eine Meldung an, die die Anzahl der verarbeiteten Dateien angibt.

Haben Sie eine Idee, woher das Problem kommen könnte?

Sie müssen im Debug-Modus schauen, woher das Problem genau kommt.
Worauf codieren Sie, Visual Studio Code?

Hallo

Weitere Informationen finden Sie in diesem Thema: Fehler beim Ausführen eines PowerShell-Skripts - Microsoft Q&A
Da SW in 64 Bit ist, können Sie auf dieser Ebene ein Problem haben (wenn das Excel-Add-In in 32 Bit ist).
Darüber hinaus fällt es mir schwer, die Tatsache zu verstehen, dass SW ohne Excel vorhanden ist, SW verlässt sich für einige Funktionen auf Excel, so dass Sie theoretisch die Software auf der Workstation benötigen.

1 „Gefällt mir“

Hallo

Der Code, den ich für die Funktion Get-SWFileProperties bereitgestellt habe, verwendet das PowerShell-Modul ImportExcel , um Daten in eine Excel-Datei zu exportieren. Dieses Modul funktioniert unabhängig von der auf meinem Computer installierten Excel-Version (32-Bit oder 64-Bit), da es Excel selbst nicht direkt verwendet. Stattdessen werden Excel-Dateien direkt bearbeitet, indem .NET-Bibliotheken zum Lesen und Schreiben von Dateien im Excel-Format verwendet werden.

Ich muss Excel nicht auf meinem Computer installieren, damit das Modul ImportExcel funktioniert. Es basiert auf EPPlus, einer .NET-Bibliothek, die es mir ermöglicht, Excel-Dateien (.xlsx) zu erstellen und zu bearbeiten, ohne Excel zu benötigen. Dies bedeutet, dass mein Skript unabhängig von der installierten Excel-Version funktioniert, und ob Excel in einer 32-Bit- oder 64-Bit-Version vorliegt, hat keinen Einfluss auf die Ausführung meines Skripts.

Wenn Sie Lust haben, müssen Sie nur das Repertoire Get-SWFileProperties -directoryPath "F:\Machine_3D\BDD" ändern, um es auszuprobieren. Prüfen Sie, ob es bei Ihnen funktioniert.

Dieses Skript versucht, eine Instanz der SolidWorks COM-Komponente mit New-Object -ComObjectzu erstellen. Wenn dies erfolgreich ist, wird eine Meldung angezeigt, die darauf hinweist, dass die SolidWorks COM-Komponenten verfügbar sind. Andernfalls wird eine Meldung angezeigt, dass dies nicht der Fall ist:

Überprüfen der Verfügbarkeit von SolidWorks COM-Komponenten

Festlegen des Namens der SolidWorks COM-Komponente

$componentName = " SldWorks.Anwendung "

Versuch, eine Instanz der SolidWorks COM-Komponente zu erstellen

Versuchen Sie {
# Erstellen einer Instanz der COM-Komponente von SolidWorks
$solidWorks = Neues-Objekt -ComObject $componentName -ErrorAction Stopp
Write-Host " SolidWorks COM-Komponenten sind auf diesem System verfügbar." 
} fangen {
Write-Host " SolidWorks COM-Komponenten sind auf diesem System nicht verfügbar." 
}

Hier ist, was zurückgegeben wird:

Auf SolidWorks COM-Komponenten kann zugegriffen werden.
Beim Versuch, eine SolidWorks Instanz zu erstellen, ist ein Fehler aufgetreten:
Artikel nicht gefunden. (HRESULT Ausnahme: 0x8002802B (TYPE_E_ELEMENTNOTFOUND))

Es handelt sich also um eine Kommunikations-PB