Problème exécution script avec PowerShell

Bonjour à tous, j’ai besoin d’aide pour comprendre les API, en effet j’ai créé un petit code sympa mais il ne veut pas se lancer. Voici le message d’erreur :

Voici le script :

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

}

Exemple d’utilisation

Get-SWFileProperties -directoryPath « F:\Machine_3D\BDD »

Voici ce qu’il fait en détaille :

  1. Vérification du module ImportExcel : Le script commence par vérifier si le module PowerShell ImportExcel est disponible. Ce module est nécessaire pour créer et manipuler des fichiers Excel sans avoir besoin d’Excel installé sur la machine. Si le module n’est pas trouvé, il tente de l’installer. Ce module est utilisé pour exporter les données collectées vers un fichier Excel.
  2. Préparation du fichier Excel de sortie : Un chemin de fichier Excel (SolidWorks_Properties.xlsx) est construit en utilisant le chemin du dossier fourni comme paramètre. Ce fichier servira à stocker les propriétés extraites des fichiers SolidWorks.
  3. Initialisation de l’application SolidWorks : Le script crée une instance de l’application SolidWorks en utilisant COM Automation (Component Object Model). Cette instance est utilisée pour ouvrir les fichiers SolidWorks et extraire leurs propriétés. L’instance de SolidWorks est configurée pour ne pas être visible ($SolidWorks.Visible = $false), ce qui permet au script de s’exécuter en arrière-plan sans ouvrir l’interface utilisateur de SolidWorks.
  4. Parcours des fichiers SolidWorks : Le script recherche dans le dossier spécifié tous les fichiers avec les extensions. sldprt (pièces), .slddrw (dessins) et .sldasm (assemblages), y compris dans tous les sous-dossiers (option -Recurse).
  5. Extraction et stockage des propriétés : Pour chaque fichier trouvé, le script détermine son type (pièce, dessin ou assemblage) et utilise SolidWorks pour l’ouvrir en mode silencieux. Il extrait ensuite les propriétés personnalisées du fichier ouvert à l’aide du CustomPropertyManager. Les noms et valeurs des propriétés sont stockés dans un objet $data.
  6. Exportation des données vers Excel : Après avoir traité tous les fichiers, les données collectées sont exportées dans le fichier Excel préparé à l’étape 2, en utilisant le module ImportExcel. Chaque entrée contiendra le chemin du fichier et ses propriétés personnalisées.
  7. Nettoyage : À la fin de l’exécution, l’application SolidWorks est fermée ($SolidWorks.ExitApp()), et le script affiche un message indiquant le nombre de fichiers traités.

Avez-vous une idée d’où le problème peux venir ?

Il faut regarder en mode debug d’où vient exactement le problème.
Tu codes sur quoi, Visual Studio Code ?

Bonjour,

Peut-être voir ce sujet: Error when running a powershell script - Microsoft Q&A
SW étant en 64 bits vous avez peut-être un problème à ce niveau (si le complément Excel est en 32bits).
Par ailleurs j’ai du mal à comprendre le fait d’avoir SW sans Excel, SW s’appui sur Excel pour certaines fonctions donc en théorie il faut le logiciel sur le poste.

1 « J'aime »

Bonjour,

Le code que j’ai fourni pour la fonction Get-SWFileProperties utilise le module PowerShell ImportExcel pour exporter des données vers un fichier Excel. Ce module fonctionne indépendamment de la version d’Excel installée sur ma machine (32 bits ou 64 bits) car il n’utilise pas directement Excel lui-même. Au lieu de cela, il manipule directement les fichiers Excel en utilisant les bibliothèques .NET pour lire et écrire des fichiers au format Excel.

Je n’ai pas besoin d’une installation d’Excel sur ma machine pour que le module ImportExcel fonctionne. Il s’appuie sur EPPlus, une bibliothèque .NET qui me permet de créer et de manipuler des fichiers Excel (.xlsx) sans nécessiter Excel. Cela signifie que mon script fonctionnera indépendamment de la version d’Excel installée, et la question de savoir si Excel est en version 32 bits ou 64 bits n’influence pas l’exécution de mon script.

Si le cœur vous en dit, vous avez juste à changer le répertoire Get-SWFileProperties -directoryPath "F:\Machine_3D\BDD" pour faire des essais. Voyez si cela fonctionne de votre côté.

Ce script tente de créer une instance du composant COM de SolidWorks en utilisant New-Object -ComObject. S’il réussit, il affiche un message indiquant que les composants COM de SolidWorks sont disponibles. Sinon, il affiche un message indiquant qu’ils ne le sont pas:

Vérification de la disponibilité des composants COM de SolidWorks

Définition du nom du composant COM de SolidWorks

$componentName = « SldWorks.Application »

Tentative de création d’une instance du composant COM de SolidWorks

try {
# Création d’une instance du composant COM de SolidWorks
$solidWorks = New-Object -ComObject $componentName -ErrorAction Stop
Write-Host « Les composants COM de SolidWorks sont disponibles sur ce système. »
} catch {
Write-Host « Les composants COM de SolidWorks ne sont pas disponibles sur ce système. »
}

Voici ce qu’il retourne:

Les composants COM de SolidWorks sont accessibles.
Une erreur est survenue lors de la tentative de création d’une instance de SolidWorks :
Élément introuvable. (Exception de HRESULT : 0x8002802B (TYPE_E_ELEMENTNOTFOUND))

Donc c’est bien un pb de communication