web-dev-qa-db-fra.com

Comment vérifier si une applet de commande existe dans PowerShell au moment de l'exécution via un script

J'ai un script PowerShell qui doit s'exécuter sous plusieurs hôtes (PowerGUI, PowerShell ISE , etc ...), mais j'ai un problème où parfois une applet de commande n'existe pas sous l'un des hôtes . Existe-t-il un moyen de vérifier si une applet de commande existe afin que je puisse encapsuler le code dans un bloc if et faire autre chose lorsqu'il n'existe pas?

Je sais que je pourrais utiliser le $Host.name pour sectionner le code supposé s'exécuter sur chaque hôte, mais je préférerais utiliser Détection de fonction à la place au cas où l'applet de commande serait ajoutée à l'avenir.

Je pourrais également utiliser un bloc try/catch, mais comme il s'exécute en code managé, je suppose qu'il n'y a pas lieu de détecter si une applet de commande est installée via du code.

48
Greg Bray

Utilisez le Get-Command applet de commande pour tester l'existence d'une applet de commande:

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

Et si vous voulez vous assurer qu'il s'agit d'une applet de commande (et non d'un exe, d'une fonction ou d'un script), utilisez le -CommandType paramètre, par exemple -CommandType Cmdlet

102
Keith Hill

Ceci est une fonction simple pour faire ce que vous aimez faire :)

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

Comment utiliser (par exemple):

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