Problem z wykonywaniem skryptu w programie PowerShell

Witam wszystkich, potrzebuję pomocy, aby zrozumieć interfejsy API, rzeczywiście stworzyłem ładny mały kod, ale nie chce się uruchomić. Oto komunikat o błędzie:

Oto scenariusz:

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

}

Przykład zastosowania

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

Oto, co robi w szczegółach:

  1. Sprawdzanie modułu ImportExcel: Skrypt rozpoczyna się od sprawdzenia, czy moduł ImportExcel PowerShell jest dostępny. Ten moduł jest wymagany do tworzenia i manipulowania plikami Excela bez konieczności instalowania programu Excel na komputerze. Jeśli moduł nie zostanie znaleziony, spróbuje go zainstalować. Moduł ten służy do eksportu zebranych danych do pliku Excel.
  2. Przygotowanie wyjściowego pliku Excel: Ścieżka do pliku Excel (SolidWorks_Properties.xlsx) jest tworzona przy użyciu ścieżki folderu podanej jako parametr. Plik ten będzie używany do przechowywania właściwości wyodrębnionych z plików SolidWorks.
  3. Inicjalizacja aplikacji SolidWorks: Skrypt tworzy instancję aplikacji SolidWorks przy użyciu COM Automation (Component Object Model). To wystąpienie jest używane do otwierania plików SolidWorks i wyodrębniania ich właściwości. Instancja SolidWorks jest skonfigurowana jako niewidoczna ($SolidWorks.Visible = $false), co pozwala skryptowi działać w tle bez otwierania interfejsu użytkownika SolidWorks.
  4. Przeglądanie plików SolidWorks: Skrypt przeszukuje określony folder w poszukiwaniu wszystkich plików z rozszerzeniami. sldprt (części), .slddrw (rysunki) i .sldasm (złożenia), w tym wszystkie podfoldery (opcja -Recurse).
  5. Wyodrębnij i zapisz właściwości: Dla każdego znalezionego pliku skrypt określa jego typ (część, rysunek lub złożenie) i używa SolidWorks do otwarcia go w trybie cichym. Następnie wyodrębnia właściwości niestandardowe z otwartego pliku za pomocą elementu CustomPropertyManager. Nazwy właściwości i wartości są przechowywane w obiekcie $data.
  6. Eksport danych do Excela: Po przetworzeniu wszystkich plików, zebrane dane są eksportowane do pliku Excel przygotowanego w kroku 2, za pomocą modułu ImportExcel. Każdy wpis będzie zawierał ścieżkę do pliku i jego właściwości niestandardowe.
  7. Oczyszczanie: Na końcu przebiegu, aplikacja SolidWorks jest zamykana ($SolidWorks.ExitApp()), a skrypt wyświetla komunikat wskazujący liczbę przetworzonych plików.

Czy masz pojęcie, skąd może wynikać problem?

Musisz poszukać w trybie debugowania, skąd dokładnie bierze się problem.
Na czym kodujesz, Visual Studio Code?

Witam

Może zapoznać się z tym tematem: Błąd podczas uruchamiania skryptu programu PowerShell - Microsoft Q&A
Ponieważ oprogramowanie jest w wersji 64-bitowej, możesz mieć problem na tym poziomie (jeśli dodatek Excel jest w wersji 32-bitowej).
Co więcej, trudno mi zrozumieć fakt posiadania oprogramowania bez Excela, oprogramowanie opiera się na Excelu dla niektórych funkcji, więc teoretycznie potrzebujesz oprogramowania na stacji roboczej.

1 polubienie

Witam

Kod, który podałem dla funkcji Get-SWFileProperties , wykorzystuje moduł PowerShell ImportExcel do eksportowania danych do pliku Excel. Ten moduł działa niezależnie od wersji Excela zainstalowanej na moim komputerze (32-bitowej lub 64-bitowej), ponieważ nie korzysta bezpośrednio z samego Excela. Zamiast tego bezpośrednio manipuluje plikami programu Excel przy użyciu bibliotek .NET do odczytywania i zapisywania plików w formacie programu Excel.

Nie muszę instalować Excela na moim komputerze, aby moduł ImportExcel działał. Jest oparty na EPPlus, bibliotece .NET, która pozwala mi tworzyć i manipulować plikami Excela (.xlsx) bez konieczności korzystania z Excela. Oznacza to, że mój skrypt będzie działał niezależnie od zainstalowanej wersji Excela, a to, czy Excel jest w wersji 32-bitowej czy 64-bitowej, nie ma wpływu na wykonanie mojego skryptu.

Jeśli masz na to ochotę, po prostu musisz zmienić repertuar Get-SWFileProperties -directoryPath "F:\Machine_3D\BDD" , aby go wypróbować. Sprawdź, czy to działa po Twojej stronie.

Ten skrypt próbuje utworzyć instancję komponentu COM SolidWorks za pomocą New-Object -ComObject. Jeśli to się powiedzie, wyświetlany jest komunikat wskazujący, że komponenty COM SolidWorks są dostępne. W przeciwnym razie zostanie wyświetlony komunikat, że nie są:

Sprawdzanie dostępności komponentów COM SolidWorks

Ustawianie nazwy komponentu COM SolidWorks

$componentName = " SldWorks.Application "

Próba utworzenia wystąpienia komponentu COM SolidWorks

try {
# Tworzenie instancji komponentu COM SolidWorks
$solidWorks = Nowy-Obiekt -ComObject $componentName -ErrorAction Stop
Host zapisu " Komponenty COM SolidWorks są dostępne w tym systemie." 
} złapać {
Host zapisu " Komponenty COM SolidWorks nie są dostępne w tym systemie." 
}

Oto, co zwraca:

Komponenty COM SolidWorks są dostępne.
Wystąpił błąd podczas próby utworzenia instancji SolidWorks:
Nie znaleziono przedmiotu. (Wyjątek HRESULT: 0x8002802B (TYPE_E_ELEMENTNOTFOUND))

Jest to więc komunikacja pb