2010-10-12 8 views
35

Mam skrypt PowerShell, który musi działać pod wieloma hostami (PowerGUI, PowerShell ISE, itp ...), ale mam problem, w którym czasami cmdlet doesn istnieją pod jednym z hostów. Czy istnieje sposób sprawdzenia, czy istnieje cmdlet, aby można było opakować kod w bloku if i zrobić coś innego, gdy nie istnieje?Jak sprawdzić, czy cmdlet istnieje w PowerShellu w środowisku wykonawczym za pomocą skryptu

Wiem, że mógłbym użyć kodu $host.name, aby podzielić kod, który powinien być uruchamiany na każdym hoście, ale wolałbym użyć Feature Detection zamiast tego, gdyby cmdlet kiedykolwiek został dodany w przyszłości.

Mogę również użyć bloku prób/catch, ale ponieważ działa w zarządzanym kodzie, zakładam, że jest daleko, aby wykryć, czy cmdlet jest instalowany za pomocą kodu.

Odpowiedz

75

Użyj Get-Command komandletu przetestować dla istnienia cmdletu:

if (Get-Command $cmdName -errorAction SilentlyContinue) 
{ 
    "$cmdName exists" 
} 

A jeśli chcesz mieć pewność, że jest to cmdlet (a nie exe lub funkcja lub skrypt) używać -CommandType parametru np -CommandType Cmdlet

+0

Nie wiedziałem, że wystąpił błąd w parametrzeAction. Znalazłem listę wszystkich wspólnych parametrów tutaj: http://msdn.microsoft.com/en-us/library/dd901844(VS.85).aspx, co warto wiedzieć. Dzięki! –

+6

UWAGA: możesz również sprawdzić moduły, używając 'if (get-module | Gdzie-Object {$ _. Name -eq" ServerManager "}) {" Moduł istnieje "}'. Więcej szczegółów: http://stackoverflow.com/questions/10027156/how-to-import-system-modules-automatically –

+0

cmdlet może istnieć, ale nie będzie dostępny. Dobry przykład: Get-WinEvent istnieje w systemie Windows 2003, ale generuje wyjątek NotImplemented. Jak poradzisz sobie z tą sytuacją? – Neolisk

9

jest to prosta czynność, aby robić to, co jesteś jak zrobić :)

function Check-Command($cmdname) 
{ 
    return [bool](Get-Command -Name $cmdname -ErrorAction SilentlyContinue) 
} 

Jak używać (na przykład):

if (Check-Command -cmdname 'Invoke-WebRequest') 
{ 
    Invoke-WebRequest $link -OutFile $destination 
} 
else 
{ 
    $webclient.DownloadFile($link, $destination) 
} 
Powiązane problemy