エラー情報を変数に代入する
構文
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番目の意味でのエラーを扱うためのものです。例外や構文エラーの情報をこの方法で変数に代入することはできません。