2010-10-12 29 views
35

Tengo un script de PowerShell que debe ejecutarse en varios hosts (PowerGUI, PowerShell ISE, etc.), pero tengo un problema donde algunas veces no funciona un cmdlet existe bajo uno de los hosts. ¿Hay alguna forma de comprobar si existe un cmdlet para poder ajustar el código en un bloque if y hacer otra cosa cuando no existe?Cómo comprobar si existe un cmdlet en PowerShell en tiempo de ejecución a través del script

Sé que podría usar el $host.name para seccionar el código que se supone que se ejecutará en cada host, pero preferiría usar Feature Detection en caso de que el cmdlet se agregue alguna vez en el futuro.

También podría usar un bloque try/catch, pero dado que se ejecuta en código administrado, supongo que no es posible detectar si un cmdlet está instalado por código.

Respuesta

75

usar el cmdlet Get-Command para la prueba de la existencia de un cmdlet:

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

Y si usted quiere asegurarse de que es un cmdlet (y no un exe o función o script) utilizar el -CommandType parámetro por ejemplo -CommandType Cmdlet

+0

No sabía que había un parámetro ErrorAction. Se encontró la lista de todos los parámetros comunes aquí: http://msdn.microsoft.com/en-us/library/dd901844(VS.85).aspx, que es bueno saber. ¡Gracias! –

+6

NOTA: también puede verificar los Módulos usando 'if (get-module | Where-Object {$ _. Name -eq" ServerManager "}) {" Module Exists "}'. Más detalles: http://stackoverflow.com/questions/10027156/how-to-import-system-modules-automatically –

+0

cmdlet puede existir, pero no estará disponible. Buen ejemplo: Get-WinEvent existe en Windows 2003, pero arroja la excepción NotImplemented. ¿Cómo manejarías esta situación? – Neolisk

9

Ésta es una función simple de hacer lo que usted es como hacer :)

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

como utilizar (por ejemplo):

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