Cómo comprobar si existe un cmdlet en PowerShell en tiempo de ejecución mediante script


Tengo un script de PowerShell que necesita ejecutarse en varios hosts (PowerGUI, PowerShell ISE, etc...), pero tengo un problema en el que a veces un cmdlet no existe bajo uno de los hosts. ¿Hay alguna forma de comprobar si existe un cmdlet para poder empaquetar el código en un bloque if y hacer otra cosa cuando no existe?

Sé que podría usar el $host.name para seccionar el código que se supone que se ejecuta en cada host, pero preferiría usar Detección de características en su lugar, en caso de que el cmdlet se agregue en el futuro.

También podría usar un bloque try/catch, pero dado que se ejecuta en código administrado, asumo que hay una opción para detectar si un cmdlet está instalado a través de código.

Author: Peter Mortensen, 2010-10-13

2 answers

Utilice el cmdlet Get-Command para comprobar la existencia de un cmdlet:

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

Y si desea asegurarse de que es un cmdlet (y no un exe, una función o un script), utilice el parámetro -CommandType, por ejemplo -CommandType Cmdlet

 84
Author: Keith Hill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-13 05:10:47

Esta es una función simple para hacer lo que te gusta hacer:)

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

Cómo usar (por ejemplo):

if (Check-Command -cmdname 'Invoke-WebRequest')
{
     Invoke-WebRequest $link -OutFile $destination
}
else
{
     $webclient.DownloadFile($link, $destination)
}
 11
Author: Alexander Schüßler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-24 21:06:11