Sunday, June 29, 2008

前回「エラーをファイルにリダイレクトする(PowerShell 入門) 」で2>&1演算子を使用してエラーの内容を変数に保存しました。

このようにしてエラーを格納すると、その変数はErrorRecordオブジェクトとなります。

ではErrorRecordオブジェクトにはどのようなメンバーが備わっているかを確認したいと思います。

まずは、前回同様下記のようにしてErrorRecord型の変数を作成しましょう。

$err = mkdir HIRO*2.txt 2>&1

次に、Get-Memberコマンドレットでどのようなメンバーがあるかを確認します。

PS C:\Work> $err | Get-Member


   TypeName: System.Management.Automation.ErrorRecord

Name                      MemberType   Definition
----                      ----------   ----------
Equals                    Method       System.Boolean Equals(Object obj)
GetHashCode               Method       System.Int32 GetHashCode()
GetObjectData             Method       System.Void GetObjectData(SerializationInfo info, StreamingContext context)
GetType                   Method       System.Type GetType()
get_CategoryInfo          Method       System.Management.Automation.ErrorCategoryInfo get_CategoryInfo()
get_ErrorDetails          Method       System.Management.Automation.ErrorDetails get_ErrorDetails()
get_Exception             Method       System.Exception get_Exception()
get_FullyQualifiedErrorId Method       System.String get_FullyQualifiedErrorId()
get_InvocationInfo        Method       System.Management.Automation.InvocationInfo get_InvocationInfo()
get_TargetObject          Method       System.Object get_TargetObject()
set_ErrorDetails          Method       System.Void set_ErrorDetails(ErrorDetails value)
ToString                  Method       System.String ToString()
writeErrorStream          NoteProperty System.Boolean writeErrorStream=True
CategoryInfo              Property     System.Management.Automation.ErrorCategoryInfo CategoryInfo {get;}
ErrorDetails              Property     System.Management.Automation.ErrorDetails ErrorDetails {get;set;}
Exception                 Property     System.Exception Exception {get;}
FullyQualifiedErrorId     Property     System.String FullyQualifiedErrorId {get;}
InvocationInfo            Property     System.Management.Automation.InvocationInfo InvocationInfo {get;}
TargetObject              Property     System.Object TargetObject {get;}

これらの中から、主要なメンバーについて説明したいと思います。

CategoryInfoプロパティ

このプロパティは文字通りエラーの種類についての情報が格納されています。

PS C:\Work> $err.CategoryInfo

Category   : InvalidArgument
Activity   : New-Item
Reason     : ArgumentException
TargetName : C:\Work\HIRO*2.txt
TargetType : String

CategoryでInvalidArgumentとなっていることがわかります。これはdirコマンドに対して、無効な文字が含まれたパスを指定しているためです。

さらにReasonをみるとこのArgumentExceptionという例外が発生したことがわかります。

Exceptionプロパティ

Exceptionプロパティ自体も様々なメンバーを持っていますが、規定のプロパティはMessageとなっており、エラーの内容を確認することができます。

PS C:\Work> $err.Exception
パスに無効な文字が含まれています。

InvocationInfoプロパティ

このプロパティはエラーの発生場所に関する情報が格納されます。

PS C:\Work> $err.InvocationInfo


MyCommand        : New-Item
ScriptLineNumber : 1
OffsetInLine     : -2147483648
ScriptName       :
Line             : param([string[]]$paths); New-Item -type directory -path $paths
PositionMessage  :
                   発生場所 行:1 文字:34
                   + param([string[]]$paths); New-Item  <<<< -type directory -path $paths
InvocationName   : New-Item
PipelineLength   : 1
PipelinePosition : 1

TargetObjectプロパティ

このプロパティにはエラー発生時の操作対象オブジェクトが格納されます。ただし、すべてのエラーがこのフィールドを設定する訳ではないため、Nullの場合もあります。

PS C:\Work> $err.TargetObject C:\Work\HIRO*2.txt

 

このようにErrorRecordオブジェクトにはエラーの原因を解明する上で役立つ情報が格納されています。

ぜひ、ErrorRecordオブジェクトの利用方法を理解し、スクリプトのデバッグに活用してください。

Sunday, June 29, 2008 10:56:02 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Comments are closed.

Theme design by Jelle Druyts

Pick a theme: