2010-10-12 17 views
35

Ho uno script PowerShell che deve essere eseguito in più host (PowerGUI, PowerShell ISE, ecc.), Ma sto riscontrando un problema dove a volte un cmdlet non lo fa esiste sotto uno dei padroni di casa C'è un modo per verificare se esiste un cmdlet in modo che io possa avvolgere il codice in un blocco if e fare qualcos'altro quando non esiste?Come verificare se esiste un cmdlet in PowerShell in fase di esecuzione tramite script

So che potrei usare il $host.name per suddividere il codice che si suppone debba essere eseguito su ciascun host, ma preferirei usare Feature Detection nel caso in cui il cmdlet venga aggiunto in futuro.

Inoltre, è possibile utilizzare un blocco try/catch, ma poiché viene eseguito nel codice gestito presumo che ci sia via per rilevare se un cmdlet è installato tramite codice.

risposta

75

Utilizzare la Get-Command cmdlet per verificare l'esistenza di un cmdlet:

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

E se si vuole per assicurarsi che sia un cmdlet (e non un exe o una funzione o uno script) utilizzare il -CommandType parametro, ad esempio -CommandType Cmdlet

+0

Non sapevo che esistesse un parametro Errore. Trovato l'elenco di tutti i parametri comuni qui: http://msdn.microsoft.com/en-us/library/dd901844(VS.85).aspx che è bello sapere. Grazie! –

+6

NOTA: puoi anche controllare i moduli usando 'if (get-module | Where-Object {$ _. Name -eq" ServerManager "}) {" Module Exists "}'. Maggiori dettagli: http://stackoverflow.com/questions/10027156/how-to-import-system-modules-automatically –

+0

cmdlet potrebbe esistere, ma non essere disponibile. Buon esempio: Get-WinEvent esiste su Windows 2003, ma genera un'eccezione NotImplemented. Come gestiresti questa situazione? – Neolisk

9

Questa è una semplice funzione di fare ciò che siete come fare :)

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

Come utilizzare (per esempio):

if (Check-Command -cmdname 'Invoke-WebRequest') 
{ 
    Invoke-WebRequest $link -OutFile $destination 
} 
else 
{ 
    $webclient.DownloadFile($link, $destination) 
} 
Problemi correlati