web-dev-qa-db-ja.com

スクリプトを使用して実行時にPowerShellにコマンドレットが存在するかどうかを確認する方法

複数のホスト(PowerGUI、 PowerShell ISE など)で実行する必要があるPowerShellスクリプトがありますが、ホストの1つにコマンドレットが存在しないことがあるという問題があります。コマンドブロックが存在するかどうかを確認して、ifブロックでコードをラップし、存在しないときに何か他のことを実行できるようにする方法はありますか?

$Host.nameを使用して各ホストで実行するコードをセクション化できることは知っていますが、コマンドレットが将来追加される場合は Feature Detection を使用することをお勧めします。

Try/catchブロックを使用することもできますが、マネージコードで実行されるため、コマンドレットがコードを介してインストールされているかどうかを検出する余地があると思います。

48
Greg Bray

使用 Get-Commandコマンドレットの存在をテストするコマンドレット:

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

また、コマンドレット(exe、関数、スクリプトではない)であることを確認する場合は、-CommandTypeパラメータ例-CommandType Cmdlet

102
Keith Hill

これはあなたがやりたいことをする簡単な機能です:)

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)
}
19