Как проверить, существует ли командлет в PowerShell во время выполнения с помощью сценария - PullRequest
47 голосов
/ 13 октября 2010

У меня есть сценарий PowerShell, который должен запускаться на нескольких хостах (PowerGUI, PowerShell ISE и т. Д.), Но у меня возникает проблема, когда иногда командлет не существует под одним из хозяева. Есть ли способ проверить, существует ли командлет, чтобы я мог обернуть код в блок if и сделать что-то еще, когда он не существует?

Я знаю, что мог бы использовать $host.name для разделения кода, который предполагается запустить на каждом хосте, но я бы предпочел использовать Обнаружение функций вместо этого в случае, если командлет когда-нибудь будет добавлен в будущем .

Я также мог бы использовать блок try / catch, но, поскольку он выполняется в управляемом коде, я предполагаю, что есть возможность определить, установлен ли командлет через код.

Ответы [ 2 ]

100 голосов
/ 13 октября 2010

Используйте командлет Get-Command, чтобы проверить наличие командлета:

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

И если вы хотите убедиться, что это командлет (а не exe, функция или скрипт), используйте параметр -CommandType, например, -CommandType Cmdlet

18 голосов
/ 03 апреля 2015

Это простая функция для выполнения того, что вы делаете:)

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

Как использовать (например):

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