So überprüfen Sie, ob das PowerShell-Snap-In bereits geladen ist, bevor Sie Add-PSSnapin aufrufen

90

Ich habe eine Gruppe von PowerShell-Skripten, die manchmal zusammen ausgeführt werden, manchmal einzeln. Für jedes der Skripte muss ein bestimmtes Snap-In geladen werden.

Im Moment ruft jedes Skript Add-PSSnapin XYZam Anfang auf.

Wenn ich nun mehrere Skripte hintereinander ausführe, werfen die folgenden Skripte:

Windows PowerShell-Snap-In XYZ kann nicht hinzugefügt werden, da es immer hinzugefügt wird. Überprüfen Sie den Namen des Snap-Ins und versuchen Sie es erneut.

Wie kann ich jedes Skript überprüfen lassen, um festzustellen, ob das Snap-In bereits geladen ist, bevor Add-PSSnapin aufgerufen wird?

Joshuapoehls
quelle

Antworten:

133

Sie sollten in der Lage sein, dies mit so etwas zu tun, bei dem Sie nach dem Snapin fragen, PowerShell jedoch anweisen, keine Fehler zu machen, wenn es nicht gefunden werden kann:

if ( (Get-PSSnapin -Name MySnapin -ErrorAction SilentlyContinue) -eq $null )
{
    Add-PsSnapin MySnapin
}
Scott Saad
quelle
Ah-hah! Genau das brauchte ich, danke! Ich hatte in meinen Experimenten etwas Ähnliches versucht, wusste aber nichts über die -ErrorAction SilentlyContinue.
Joshuapoehls
2
SilentlyContinue ist, weil Get-PSSnapin nicht leise null zurückgibt, wenn der Snap-In nicht standardmäßig gefunden wird. Es ist ein Fehler.
Rich
1
Für Faulenzer: Dieser Artikel enthält ein vollständiges Codebeispiel, mit dem Sie vor dem Laden überprüfen können, ob ein Snap-In registriert ist.
Herzbube
21

Scott hat dir bereits die Antwort gegeben. Sie können es auch trotzdem laden und den Fehler ignorieren, wenn es bereits geladen ist:

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue
Shay Levy
quelle
6
Dies würde auch stillschweigend fortgesetzt, wenn das Snap-In aus anderen Gründen wie der Nichtinstallation nicht geladen würde. Dies könnte dazu führen, dass Probleme für Benutzer Ihres Skripts schwer zu diagnostizieren sind.
Graham Ambrose
Richtig, in diesem Fall können wir zuerst prüfen, ob das Snap-In registriert ist.
Shay Levy
4

Überraschenderweise erwähnte niemand die native Methode für Skripte, um Abhängigkeiten anzugeben: die #REQUIRES -PSSnapin Microsoft.PowerShell...Kommentar- / Präprozessor-Direktive. Trotzdem könnten Sie eine Erhöhung mit -RunAsAdministrator, Module mit -Modules Module1,Module2und eine bestimmte Runspace-Version benötigen.

Lesen Sie mehr durch Tippen Get-Help about_requires

Alexey
quelle
Diese Lösung scheint mir der "richtige" Weg zu sein, dies zu tun.
Grax32
1
Das Problem, das ich damit hatte, ist, dass Powershell einen Fehler zurückgibt, wenn das erforderliche Snapin nicht geladen ist, und ich würde annehmen, dass jeder möchte, dass das Snapin geladen wird, wenn es nicht geladen ist.
Dwayne Driskill
1
Module sind neuer und es sind Module, die bei Bedarf automatisch geladen werden, nicht PSSnapins, Sie haben Recht. Aber zumindest wird nichts kaputt gemacht oder verschmutzt, wenn der Teil des Skripts ausgeführt wird, der ohne das Snapin funktioniert.
Alexey
3

Ich habe das Codebeispiel von @ ScottSaad ausprobiert, aber es hat bei mir nicht funktioniert. Ich habe nicht genau herausgefunden, warum, aber die Prüfung war unzuverlässig, manchmal erfolgreich und manchmal nicht. Ich fand, dass die Verwendung einer Where-ObjectFilterung für das NameGrundstück besser funktioniert:

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

Code mit freundlicher Genehmigung von dieser .

Andy McCluggage
quelle
1

Scott Saads funktioniert, aber das scheint mir etwas schneller zu sein. Ich habe es nicht gemessen, aber es scheint nur ein bisschen schneller zu laden, da es nie eine Fehlermeldung erzeugt.

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