Monday, June 30, 2008

前回はErrorRecordオブジェクトについて説明しました。

PowerShellではエラーが発生するごとに、そのエラー内容(ErrorRecord)を保存している変数があります。

この変数は、"Error"という名前がついた自動変数でSystem.ArrayList型となっています。

また、この変数に格納できる最大要素数は自動変数 MaximumErrorCount で決められておりデフォルト値は256となっています。

では、実際にエラーを発生させてError変数がどのように変わっていくのかをみてみたいと思います。(PowerShellを立ち上げていた方は、念のため起動し直してから始めてください)

まずは、現在のError変数の内容を確認しておきましょう。

PS C:\Work> $Error
PS C:\Work>

この時点ではエラーは発生していないので、何も格納されていません。

 

次に前回同様、下記のように入力してエラーを発生させます。

PS C:\Work> dir HIRO.txt
Get-ChildItem : パス 'C:\Work\HIRO.txt' が存在しないため検出できません。
発生場所 行:1 文字:4
+ dir  <<<< HIRO.txt

エラーを発生させた後のError変数はどうなったでしょうか?

PS C:\Work> $Error
Get-ChildItem : パス 'C:\Work\HIRO.txt' が存在しないため検出できません。
発生場所 行:1 文字:4
+ dir  <<<< HIRO.txt

上記のように、先ほど発生した内容が格納されていることがわかります。

要素数はどうなったでしょうか?

PS C:\Work> $Error.Count
1

エラーは1つしか発生していないので、当然"1"となります。

では、このError変数が本当にErrorRecordオブジェクトを格納しているのかGetType()メソッドで確かめてみましょう。

(ここでは要素番号0の型をGetType()メソッドで確認しています。)

PS C:\Work> $Error[0].GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     ErrorRecord                              System.Object

次に、もう1つエラーを発生させてみましょう。

PS C:\Work> mkdir HIRO*2.txt
New-Item : パスに無効な文字が含まれています。
発生場所 行:1 文字:34
+ param([string[]]$paths); New-Item  <<<< -type directory -path $paths

この状態でError変数の内容を確認してみると

PS C:\Work> $Error
New-Item : パスに無効な文字が含まれています。
発生場所 行:1 文字:34
+ param([string[]]$paths); New-Item  <<<< -type directory -path $paths
Get-ChildItem : パス 'C:\Work\HIRO.txt' が存在しないため検出できません。
発生場所 行:1 文字:4
+ dir  <<<< HIRO.txt

少し見づらいですが、2つのエラーが格納されていることがわかります。

Error[0]には何が格納されているか確認してみましょう。

PS C:\Work> $Error[0]
New-Item : パスに無効な文字が含まれています。
発生場所 行:1 文字:34
+ param([string[]]$paths); New-Item  <<<< -type directory -path $paths

ご覧の通りインデックス0には、常に最後に発生したエラーが格納されます。

このように、Error変数はエラーの履歴をMaximumErrorCount変数で定められた数だけ保持しますので、過去にさかのぼってエラーを追跡することが可能です。

Monday, June 30, 2008 10:12:25 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Comments are closed.

Theme design by Jelle Druyts

Pick a theme: