PowerShellのコマンドレットのエラーをTry..Catchする方法

PowerShellのコマンドレットでエラーが発生したときに Try Catch したいのですが、コマンドレットはエラー返却のため Catch の処理が動きません。
しかし、 -ErrorAction Stop をコマンドレットに設定すれば例外として Catch でトラップすることができます。

以下にサンプルを記します。

動作確認環境

コマンドレットのエラーを Catch でトラップするサンプル

以下、Get-ChildItem コマンドレットを使った例となります。

通常動作

指定したパスがないのでエラーが表示されます。

PS C:\> $non_existent_path = 'foo'

PS C:\> Get-ChildItem $non_existent_path
Get-ChildItem : パス 'C:\foo' が存在しないため検出できません。
発生場所 行:1 文字:1
+ Get-ChildItem $non_existent_path
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\foo:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

Try Catch を試す

Catch にトラップされず、finallyの処理は実行されました。

サンプルコード

$non_existent_path = 'foo'
try {
  Get-ChildItem $non_existent_path
}
catch {
  Write-Host 'catch'
}
finally {
  Write-Host 'finally'
}

実行結果

Get-ChildItem : パス 'C:\foo' が存在しないため検出できません。

発生場所 行:3 文字:3

  1. Get-ChildItem $non_existent_path
  2. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

       + CategoryInfo          : ObjectNotFound: (C:\foo:String) [Get-ChildItem], ItemNotFoundException
       + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
    
    finally

Try Catch を試す

-ErrorAction Stopをコマンドレットに追記して実行すると Catch の処理が動作します。

サンプルコード

$non_existent_path = 'foo'
try {
  Get-ChildItem -ErrorAction Stop $non_existent_path
}
catch {
  Write-Host 'catch'
}
finally {
  Write-Host 'finally'
}

実行結果

catch
finally

例外メッセージを取得する

以下の構文により Catch にトラップされた例外メッセージを取得することができます。  $_.Exception.Message

サンプルコード

Catch に $_.Exception.Message を追記しています。

$non_existent_path = 'foo'
try {
  Get-ChildItem -ErrorAction Stop $non_existent_path
}
catch {
  Write-Host 'catch'
  Write-Host $_.Exception.Message
}
finally {
  Write-Host 'finally'
}

実行結果

catch
パス 'C:\foo' が存在しないため検出できません。
finally

以上、コマンドレットのエラーを Try Catch でトラップする方法でした。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS