Jak sprawdzić, czy przystawka PowerShell jest już załadowana przed wywołaniem Add-PSSnapin

90

Mam grupę skryptów PowerShell, które czasami są uruchamiane razem, czasami pojedynczo. Każdy ze skryptów wymaga załadowania określonej przystawki.

W tej chwili każdy skrypt wywołuje Add-PSSnapin XYZna początku.

Teraz, jeśli uruchomię wiele skryptów z powrotem do tyłu, kolejne skrypty rzucą:

Nie można dodać przystawki XYZ programu Windows PowerShell, ponieważ jest już dodawana. Sprawdź nazwę przystawki i spróbuj ponownie.

Jak mogę sprawić, aby każdy skrypt sprawdził, czy przystawka jest już załadowana przed wywołaniem Add-PSSnapin?

joshuapoehls
źródło

Odpowiedzi:

133

Powinieneś być w stanie zrobić to za pomocą czegoś takiego, jak zapytanie o Snapin, ale powiedz PowerShell, aby nie wyświetlał błędów, jeśli nie może go znaleźć:

if ( (Get-PSSnapin -Name MySnapin -ErrorAction SilentlyContinue) -eq $null )
{
    Add-PsSnapin MySnapin
}
Scott Saad
źródło
Ah-hah! Właśnie tego potrzebowałem, dziękuję! Próbowałem czegoś podobnego podczas eksperymentów, ale nie wiedziałem o -ErrorAction SilentlyContinue.
joshuapoehls
2
SilentlyContinue jest spowodowane tym, że Get-PSSnapin nie zwraca po cichu wartości null, gdy if nie znajdzie przystawki domyślnie. Błąd.
Rich
1
Dla leniwych: ten artykuł zawiera przykład pełnego kodu, jak również sprawdzić, czy przystawka jest zarejestrowana przed jej załadowaniem.
herzbube
21

Scott już udzielił ci odpowiedzi. Możesz również załadować go mimo wszystko i zignorować błąd, jeśli jest już załadowany:

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue
Shay Levy
źródło
6
Byłoby to również kontynuowane po cichu, gdyby przystawka nie załadowała się z innych powodów, takich jak brak instalacji. Może to prowadzić do trudnych do zdiagnozowania problemów u osób korzystających z Twojego skryptu.
Graham Ambrose
Tak, w takim przypadku możemy najpierw sprawdzić, czy przystawka jest zarejestrowana.
Shay Levy
4

Zaskakujące jest, że nikt nie wspomniał o natywnym sposobie definiowania zależności przez skrypty: #REQUIRES -PSSnapin Microsoft.PowerShell...dyrektywie comment / preprocessor. Tak samo, możesz wymagać podniesienia uprawnień -RunAsAdministrator, modułów z -Modules Module1,Module2określoną wersją Runspace.

Przeczytaj więcej wpisując Get-Help about_requires

Alexey
źródło
Wydaje mi się, że to rozwiązanie jest „właściwą” drogą do osiągnięcia tego celu.
Grax32
1
Problem, który miałem z tym, polega na tym, że Powershell zwraca błąd, jeśli wymagana przystawka nie jest załadowana i zakładam, że wszyscy chcieliby załadować snapin, jeśli nie jest.
Dwayne Driskill
1
Moduły są nowsze i to moduły są ładowane automatycznie w razie potrzeby, a nie PSSnapiny, masz rację. Ale przynajmniej nic nie zostanie zepsute ani zaśmiecone przez uruchomienie części skryptu, która działa bez przystawki.
Alexey
3

Wypróbowałem przykład kodu @ ScottSaad, ale nie zadziałał. Nie dowiedziałem się dokładnie, dlaczego, ale sprawdzenie było zawodne, czasami się udawało, a czasami nie. Okazało się, że użycie Where-Objectfiltrowania we Namewłaściwości działa lepiej:

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

Kod uprzejmości tego .

Andy McCluggage
źródło
1

Scott Saads działa, ale wydaje mi się to nieco szybsze. Nie mierzyłem tego, ale wydaje się, że ładuje się trochę szybciej, ponieważ nigdy nie generuje komunikatu o błędzie.

$snapinAdded = Get-PSSnapin | Select-String $snapinName
if (!$snapinAdded)
{
    Add-PSSnapin $snapinName
}
Kjetil Ytrehus
źródło