- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2023-11-02T21:11:09+09:00","","")
#navi(../)
* PowerShellのコマンドレットのエラーをTry..Catchする方法 [#x217b05f]
PowerShellのコマンドレットでエラーが発生したときに Try Catch したいのですが、コマンドレットはエラー返却のため Catch の処理が動きません。~
しかし、 ''-ErrorAction Stop'' をコマンドレットに設定すれば例外として Catch でトラップすることができます。
以下にサンプルを記します。
#contents
* 動作確認環境 [#wedfb997]
- Windows 10 22H2
- PowerShell
PS C:\> $PSVersionTable.PSVersion.ToString()
5.1.19041.3636
* コマンドレットのエラーを Catch でトラップするサンプル [#oe9c1a46]
以下、Get-ChildItem コマンドレットを使った例となります。
** 通常動作 [#f35dc25c]
指定したパスがないのでエラーが表示されます。
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 を試す [#u3dbabfc]
Catch にトラップされず、finallyの処理は実行されました。
***サンプルコード [#f8ea3178]
$non_existent_path = 'foo'
try {
Get-ChildItem $non_existent_path
}
catch {
Write-Host 'catch'
}
finally {
Write-Host 'finally'
}
***実行結果 [#ddfbe93e]
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 を試す [#qbece2d8]
''-ErrorAction Stop''をコマンドレットに追記して実行すると Catch の処理が動作します。
***サンプルコード [#b25ae6bf]
$non_existent_path = 'foo'
try {
Get-ChildItem -ErrorAction Stop $non_existent_path
}
catch {
Write-Host 'catch'
}
finally {
Write-Host 'finally'
}
***実行結果 [#s0f345cb]
catch
finally
* 例外メッセージを取得する [#n6c57518]
以下の構文により Catch にトラップされた例外メッセージを取得することができます。
$_.Exception.Message
** サンプルコード [#obc9a559]
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'
}
** 実行結果 [#w22babbe]
catch
パス 'C:\foo' が存在しないため検出できません。
finally
以上、コマンドレットのエラーを Try Catch でトラップする方法でした。