Az előzőekben a hibajelzéseket a képernyőn olvastuk el, de ezeket a PowerShell automatikusan egy $error tömbbe gyűjti. A [0]-ás indexű elem mindig a legfrissebb hibajelzést tartalmazza, és így tolja mindig el eggyel a hibákat. Ez azért jó, mert ha ki is kapcsoljuk a hibajelzést (SilentlyContinue), az $error változó ennek ellenére őrizni fogja a fellépő hibát:
[54] PS C:\old> "54Eleje"; get-content blabla.txt -ErrorAction SilentlyConti
nue; "54Vége"
54Eleje
54Vége
[55] PS C:\old> $error[0]
Get-Content
: Cannot find path 'C:\blabla.txt' because it does not exist.
At line:1
char:23
+
"54Eleje"; get-content <<<< blabla.txt -ErrorAction SilentlyContinue;
"54Vé
ge"
+ CategoryInfo : ObjectNotFound:
(C:\blabla.txt:String) [Get-Con
tent], ItemNotFoundException
+ FullyQualifiedErrorId :
PathNotFound,Microsoft.PowerShell.Commands.GetC
ontentCommand
Ráadásul – most már nem is csodálkozunk – a $error elemei is objektumok! Nézzük meg a tagjellemzőit:
[59] PS C:\old> $error[0] | gm
TypeName: System.Management.Automation.ErrorRecord
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetObjectData Method System.Void GetObjectData(System.Runti...
GetType Method type GetType()
ToString Method string ToString()
CategoryInfo Property System.Management.Automation.ErrorCate...
ErrorDetails Property System.Management.Automation.ErrorDeta...
Exception Property System.Exception Exception {get;}
FullyQualifiedErrorId Property System.String FullyQualifiedErrorId {g...
InvocationInfo Property System.Management.Automation.Invocatio...
PipelineIterationInfo Property System.Collections.ObjectModel.ReadOnl...
TargetObject Property System.Object TargetObject {get;}
PSMessageDetails ScriptProperty System.Object PSMessageDetails {get=& ...
Itt igazából a tulajdonságok az érdekesek számunkra:
[62] PS C:\old> $error[0].categoryinfo
Category : ObjectNotFound
Activity : Get-Content
Reason : ItemNotFoundException
TargetName : C:\old\blabla.txt
TargetType : String
[63] PS C:\old> $error[0].errordetails
[64] PS C:\old> $error[0].fullyqualifiederrorid
PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
[65] PS C:\old> $error[0].invocationinfo
MyCommand : Get-Content
ScriptLineNumber : 1
OffsetInLine : -2147483648
ScriptName :
Line : "54Eleje"; get-content blabla.txt -ErrorAction SilentlyC
ontinue; "54Vége"
PositionMessage :
At line:1 char:23
+ "54Eleje"; get-content <<<< blabla.txt -ErrorAction S
ilentlyContinue; "54Vége"
InvocationName : get-content
PipelineLength : 1
PipelinePosition : 1
[66] PS C:\old> $error[0].targetobject
C:\old\blabla.txt
A CategoryInfo tulajdonság önmagában nagyon sok mindent elárul a hibáról, az InvocationInfo tulajdonságban még további részleteket láthatunk. Ezen információk birtokában tényleg nem jelenthet gondot a hibák felderítése és elhárítása.
Ha nem annyira lényeges, hogy sok információ jelenjen meg a hibákról, akkor átválthatjuk a hibajelentés nézetét egy egyszerűsített nézetre az $ErrorView változó NormalView-ról való átállításával CategoryView-ra:
[26] PS C:\> get-item c:\aaa\a.txt
Get-Item :
Cannot find path 'C:\aaa\a.txt' because it does not exist.
At line:1
char:9
+ get-item
<<<< c:\aaa\a.txt
+ CategoryInfo : ObjectNotFound:
(C:\aaa\a.txt:String) [Get-Item
], ItemNotFoundException
+ FullyQualifiedErrorId :
PathNotFound,Microsoft.PowerShell.Commands.GetI
temCommand
[27] PS C:\> $ErrorView = "CategoryView"
[28] PS C:\> get-item c:\aaa\a.txt
ObjectNotFound:
(C:\aaa\a.txt:String) [Get-Item], ItemNotFoundException
Így jóval egyszerűbb hibajelzést kapun, ami ott, ahol esetleg laikusok futtatják a szkriptjeinket, jól jöhet, mert kevésbé rémisztő.