今回から、PowerShellにおける、エラー/例外処理/デバッグ手法について説明していきたいと思います。
今回はエラーをファイルにリダイレクトする方法についてです。
まずは、「リダイレクトとは何か?」ですが、処理を行った結果の出力先を別な場所へ変更することを意味します。
通常PowerShell上で、あるコマンドを実行してエラーが発生した場合は、コンソールウィンドウにエラーメッセージが表示されます。
ここでは、このエラーをファイルに出力することをリダイレクトすると呼んでいます。
PowerShellでエラーをファイルにリダイレクトする方法にはリダイレクト演算子を使用し、3種類あります。1つずつみていきましょう。
2> 演算子
この演算子はエラーの内容をファイルに出力します。出力先のファイいるがすでに存在する場合には上書きをします。
下記は、dirコマンドで存在しないファイルを指定した場合の例です。
PS C:\Work> dir HIRO.txt
Get-ChildItem : パス 'C:\Work\HIRO.txt' が存在しないため検出できません。
発生場所 行:1 文字:4
+ dir <<<< HIRO.txt
では、このエラーをファイルにリダイレクトしてみましょう。
PS C:\Work> dir HIRO.txt 2>err.txt
上記のように、2>演算子の後ろに、エラーメッセージを書き込むファイル名を記述します。
ファイル名だけを記述した場合は、カレントディレクトリに出力します。
では Get-Contentコマンドレットを使用して実際にファイルの中身をみてみましょう。
PS C:\Work> Get-Content err.txt
Get-ChildItem : パス 'C:\Work\HIRO.txt' が存在しないため検出できません。
発生場所 行:1 文字:4
+ dir <<<< HIRO.txt 2>err.txt
エラーの内容がerr.txtに書き出されていることがおわかりいただけたかと思います。
2>> 演算子
先ほどの演算子と非常に良く似ていますが>が1つ多いですね。
この演算子は、エラーの出力先のファイルがすでに存在する場合は、追記書き込みを行います。
実験してみましょう。
追記されていることを確認するために、出力先のファイルは先ほどと同じerr.txtとします。また異なるエラーメッセージが記述されるようmkdirコマンドに変更しました。
PS C:\Work> mkdir HIRO*2.txt 2>>err.txt
実行したら、先ほど同様Get-Contentコマンドレットで確認してみましょう。
PS C:\Work> Get-Content err.txt
Get-ChildItem : パス 'C:\Work\HIRO.txt' が存在しないため検出できません。
発生場所 行:1 文字:4
+ dir <<<< HIRO.txt 2>err.txt
New-Item : パスに無効な文字が含まれています。
発生場所 行:1 文字:34
+ param([string[]]$paths); New-Item <<<< -type directory -path $paths
エラーメッセージが追記されていることがわかりますね。
2>&1 演算子
最後に2>&1演算子ですが、この演算子を使用するとエラーの内容を変数に書き込むことができます。
使用方法は下記の通りです。
$err = mkdir HIRO*2.txt 2>&1
では、エラーの内容が変数に代入されているかを確認してみましょう。
PS C:\Work> $err
New-Item : パスに無効な文字が含まれています。
発生場所 行:1 文字:34
+ param([string[]]$paths); New-Item <<<< -type directory -path $paths
通常、変数の内容を確認してもメッセージに色がつかないのですが、2>&1演算子を使用して代入された値は赤色で表示されていることがわかります。
これは、変数の型がErrorRecordであり、PowerShellがエラーと認識しているからです。
PS C:\Work> $err.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True ErrorRecord System.Object
次回は、このエラーを保持する変数について説明したいと思います。