エラー情報を変数に代入する

構文

PS U:\Work> $errorObject = Create-Error 2>&1

※Create-Errorは実際のコマンドレットではなく、ここにエラーを発生するコマンドラインを書きます。

解説

 PowerShellのエラーは何通りかの種類があります。1つは構文エラーで、存在しないコマンドを実行しようとしたときなどに発生します。2つ目はコマンドの実行結果のエラーで、存在しないファイルをRemove-Itemで削除しようとしたときなどに発生します。3つ目は例外で、trapで補足できるものです。単に「エラー」といった場合に、言葉の意味に最も合致するのは2番目です。このページでは、単に「エラー」と書いた場合は2番目の意味のエラーを意味するものとします。

 前置きが長くなりましたが、エラーを実際に起こしてみます。

PS U:\Work> Remove-Item NotFound.txt
Remove-Item : パス 'U:\Work\NotFound.txt' が存在しないため検出できません。
発生場所 行:1 文字:12
+ Remove-Item <<<<  NotFound.txt
    + CategoryInfo          : ObjectNotFound: (U:\Work\NotFound.txt:String) [Remove-Item]、ItemN
    otFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand

PS U:\Work>

 ここではすべて同じ色の文字になってしまっていますが、実際にはエラーメッセージの部分が赤色で表示されます。

 次のように書くことでエラーの詳細情報を変数に代入することができます。

PS U:\Work> $errorObject = Remove-Item NotFound.txt 2>&1

 こうすると、エラーを表すオブジェクトが $errorObject に代入されます。行末に2>&1と書かれていますが、これはリダイレクトの一種です。このように書くと、発生したエラー情報をパイプラインに流すことができます。上記の場合、パイプラインがここで終わっていますので、次のコマンドに渡される代わりに変数に代入されます。

 ちゃんと代入されたことを確認するために「$errorObject」と書いてみます。

PS U:\Work> $errorObject
Remove-Item : パス 'U:\Work\NotFound.txt' が存在しないため検出できません。
発生場所 行:1 文字:27
+ $errorObject = Remove-Item <<<<  NotFound.txt 2>&1
    + CategoryInfo          : ObjectNotFound: (U:\Work\NotFound.txt:String) [Remove-Item]、ItemN
    otFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand

PS U:\Work>

「$errorObject」と書いただけでエラーが表示されました。

 これだけでは何の意味もないのですが、エラー情報そのものをスクリプトで扱いたいときなどに役に立ちます。

 なお、この方法はあくまで冒頭に挙げた2番目の意味でのエラーを扱うためのものです。例外や構文エラーの情報をこの方法で変数に代入することはできません。

inserted by FC2 system