Comment vérifier si le composant logiciel enfichable PowerShell est déjà chargé avant d'appeler Add-PSSnapin

90

J'ai un groupe de scripts PowerShell qui sont parfois exécutés ensemble, parfois un à la fois. Chacun des scripts nécessite le chargement d'un certain composant logiciel enfichable.

En ce moment, chaque script appelle Add-PSSnapin XYZau début.

Maintenant, si j'exécute plusieurs scripts dos à dos, les scripts suivants lancent:

Impossible d'ajouter le composant logiciel enfichable Windows PowerShell XYZ car il est déjà ajouté. Vérifiez le nom du composant logiciel enfichable et réessayez.

Comment puis-je faire vérifier chaque script pour voir si le composant logiciel enfichable est déjà chargé avant d'appeler Add-PSSnapin?

Joshuapoehls
la source

Réponses:

133

Vous devriez pouvoir le faire avec quelque chose comme ceci, où vous interrogez le composant logiciel enfichable mais dites à PowerShell de ne pas l'erreur s'il ne le trouve pas:

if ( (Get-PSSnapin -Name MySnapin -ErrorAction SilentlyContinue) -eq $null )
{
    Add-PsSnapin MySnapin
}
Scott Saad
la source
Ah-hah! C'est exactement ce dont j'avais besoin, merci! J'avais essayé quelque chose de similaire dans mes expérimentations mais je ne savais pas à propos de -ErrorAction SilentlyContinue.
joshuapoehls
2
Le SilentlyContinue est dû au fait que Get-PSSnapin ne renvoie pas silencieusement null lorsque if ne trouve pas le composant logiciel enfichable par défaut. Cela fait des erreurs.
Riche le
1
Pour les paresseux: cet article fournit un exemple de code complet comment vérifier également si un composant logiciel enfichable est inscrit avant de le charger.
herzbube
21

Scott vous a déjà donné la réponse. Vous pouvez également le charger quand même et ignorer l'erreur si elle est déjà chargée:

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue
Shay Levy
la source
6
Cela continuerait également silencieusement si le composant logiciel enfichable ne se chargeait pas pour d'autres raisons, comme ne pas être installé. Ce qui pourrait conduire à des problèmes difficiles à diagnostiquer pour les personnes utilisant votre script.
Graham Ambrose
Bon, dans ce cas, nous pouvons d'abord vérifier si le composant logiciel enfichable est enregistré.
Shay Levy
4

Étonnamment, personne n'a mentionné la manière native pour les scripts de spécifier les dépendances: la #REQUIRES -PSSnapin Microsoft.PowerShell...directive comment / preprocessor. De la même manière, vous pourriez avoir besoin d'une élévation avec -RunAsAdministrator, de modules avec -Modules Module1,Module2et d'une version spécifique de Runspace.

En savoir plus en tapant Get-Help about_requires

Alexey
la source
Cette solution me semble être la «bonne» façon de procéder.
Grax32
1
Le problème que j'ai eu avec ceci est que Powershell renvoie une erreur si le composant logiciel enfichable requis n'est pas chargé et je suppose que tout le monde voudrait que le composant logiciel enfichable soit chargé si ce n'est pas le cas.
Dwayne Driskill
1
Les modules sont plus récents, et ce sont des modules qui sont chargés automatiquement selon les besoins, pas des PSSnapins, vous avez raison. Mais au moins, rien ne sera cassé ou jonché en exécutant la partie du script qui fonctionne sans le composant logiciel enfichable.
Alexey
3

J'ai essayé l'exemple de code de @ ScottSaad mais cela n'a pas fonctionné pour moi. Je n'ai pas trouvé exactement pourquoi mais le contrôle n'était pas fiable, parfois réussi et parfois non. J'ai trouvé que l'utilisation d'un Where-Objectfiltrage sur la Namepropriété fonctionnait mieux:

if ((Get-PSSnapin | ? { $_.Name -eq $SnapinName }) -eq $null) {
    Add-PSSnapin $SnapinName 
}

Code avec l'aimable autorisation de ceci .

Andy McCluggage
la source
1

Scott Saads fonctionne mais cela me semble un peu plus rapide. Je ne l'ai pas mesuré mais il semble se charger un peu plus vite car il ne produit jamais de message d'erreur.

$snapinAdded = Get-PSSnapin | Select-String $snapinName
if (!$snapinAdded)
{
    Add-PSSnapin $snapinName
}
Kjetil Ytrehus
la source