#author("2023-11-02T21:12:39+09:00","","")
#author("2023-11-02T21:13:12+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 でトラップする方法でした。
#br
#br

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS