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 XYZ
na 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?
powershell
joshuapoehls
źródło
źródło
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
źródło
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,Module2
określoną wersją Runspace.Przeczytaj więcej wpisując
Get-Help about_requires
źródło
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-Object
filtrowania weName
właściwości działa lepiej:if ((Get-PSSnapin | ? { $_.Name -eq $SnapinName }) -eq $null) { Add-PSSnapin $SnapinName }
Kod uprzejmości tego .
źródło
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 }
źródło