PowerShellのコマンドレットのエラーをTry..Catchする方法 †PowerShellのコマンドレットでエラーが発生したときに Try Catch したいのですが、コマンドレットはエラー返却のため 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 + Get-ChildItem $non_existent_path + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 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 でトラップする方法でした。 |