PowerShellのコマンドレットでエラーが発生したときに Try Catch したいのですが、コマンドレットはエラー返却のため Catch の処理が動きません。
しかし、 -ErrorAction Stop をコマンドレットに設定すれば例外として Catch でトラップすることができます。
以下にサンプルを記します。
PS C:\> $PSVersionTable.PSVersion.ToString() 5.1.19041.3636
以下、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
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
-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 でトラップする方法でした。