Elsőként nézzünk pár fogalmat. A PowerShellben két hibafajta van, a „terminating error ”, azaz a futást mindenképpen megszakító, és a „nonterminating error ”, azaz a futást nem feltétlenül megszakító hiba.
Megszakító hibák például a szintaktikai hibák, amikor elgépelünk valamit. Vagy például amikor nullával szeretnénk osztani. Mi magunk is generálhatunk ilyen hibákat a korábban már látott throw kulcsszóval, amikor például egy függvényünknek nem ad át a felhasználó minden fontos paramétert.
Előfordulhatnak olyan hibák, amelyek előállásakor nem kívánjuk, hogy a szkript futása megszakadjon, de azért szeretnénk értesülni ezekről. Ez főleg olyan cmdleteknél és függvényeknél jöhet jól, amelyek csőelemeket dolgoznak fel, és egy-két csőelem esetében megengedjük, hogy ne fusson le a szkript, de azért a többi elemre nyugodtan próbálkozzon.
Nézzünk példát a kétfajta hibára, elsőként a megszakító hibára, rögtön két példát is:
[7] PS C:\old> "Eleje"; 15/0; "Vége"
Attempted to
divide by zero.
At line:1
char:13
+
"Eleje"; 15/ <<<< 0; "Vége"
+ CategoryInfo : NotSpecified: (:) [],
ParentContainsErrorRecord
Exception
+ FullyQualifiedErrorId : RuntimeException
A [7]-es sorban 0-val osztok. Ez olyannyira „terminating”, hogy már a parancssor ellenőrzése során kiszúrja ezt a hibát, és már az „Eleje” sem fut le.
Megjegyzés:
A PowerShell 3.0-tól kezdve a 0-val való osztás nem megszakító hiba már:
PS C:\> "Eleje"; 15/0; "Vége"
Eleje
Attempted to divide by zero.
At line:1 char:10
+ "Eleje"; 15/0; "Vége"
+ ~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
Vége
A throw kulcsszóval mindenképpen megszakító hibát generálunk:
[8] PS C:\old> "Eleje"; throw "kakukk"; "Vége"
Eleje
kakukk
At line:1
char:15
+
"Eleje"; throw <<<<
"kakukk"; "Vége"
+ CategoryInfo : OperationStopped: (kakukk:String)
[], RuntimeEx
ception
+ FullyQualifiedErrorId : kakukk
A [8]-as sorban én magam okoztam egy megszakító hibát a throw kulcsszó segítségével.
Most nézzünk nem megszakító hibára példát:
[9] PS C:\old> "Eleje"; Remove-Item c:\old\nincs.txt; "Vége"
Eleje
Remove-Item
: Cannot find path 'C:\old\nincs.txt' because it does not exist.
At line:1
char:21
+
"Eleje"; Remove-Item <<<<
c:\old\nincs.txt; "Vége"
+ CategoryInfo : ObjectNotFound:
(C:\old\nincs.txt:String) [Remo
ve-Item], ItemNotFoundException
+ FullyQualifiedErrorId :
PathNotFound,Microsoft.PowerShell.Commands.Remo
veItemCommand
Vége
A fenti példában nem megszakító hiba történt, amikor törölni akartam egy nem létező fájlt, ugyan hibát kaptam, de kiírásra került a „Vége” is.
Mi magunk is befolyásolhatjuk a hibák lefolyását. Akár parancsonként vagy akár az adott konzolra vonatkozóan is. Először nézzük, hogy a cmdletek esetében mit tehetünk. A parancsokhoz tartozó súgókban legtöbbször valami hasonlót látunk:
[18] PS C:\old> (get-help remove-item).syntax
Remove-Item [-path] <string[]> [-recurse] [-force] [-include <string[]>] [-
exclude <string[]>] [-filter <string>] [-credential <PSCredential>] [-whatI
f] [-confirm] [<CommonParameters>]
Remove-Item [-literalPath] <string[]> [-recurse] [-force] [-include <string
[]>] [-exclude <string[]>] [-filter <string>] [-credential <PSCredential>]
[-whatIf] [-confirm] [<CommonParameters>]
Nézzük meg, a „CommonParameters ” mi lehet?
Paraméter
|
Magyarázat |
Verbose |
Bőbeszédes kimenetet ad a művelet lefolyásáról. |
Debug |
Hibakereső
információkat ad, és interaktív módon lekezelhetők a hibák. |
ErrorAction |
Az előzőhöz hasonló, de nem csak interaktívan, hanem fixen beállítható hibakezelési mód: Continue [default] - folytat, Stop - megáll, SilentlyContinue – figyelmeztetés nélkül továbbmegy, Inquire - rákérdez. |
ErrorVariable |
Saját
hibaváltozónk neve ($ jel nélkül!). Az $error változó mellett ide is
betöltődik a hibát leíró objektum. |
OutVariable |
Kimenetet ide tölti be. |
OutBuffer |
Az
objektum-puffer mérete, ennyi elemet „magában” tart, mielőtt továbbítja az
outputot a következő csőszakasznak. |
WarningAction |
Hasonló, mint az ErrorAction, csak épp a figyelmeztetések bekövetkezését kezeli. |
WarningVariable |
Figyelmeztetések betöltése alternatív változóba. |
A -debug paraméter pont a mostani témánkba vág, nézzük, milyen opciókat kínál:
[23] PS C:\old> "Eleje"; get-content blabla.txt -debug; "Vége"
Eleje
Confirm
Cannot find path 'C:\old\blabla.txt' because it does not exist.
[Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help
(default is "Y"):h
Get-Content
: Command execution stopped because the user selected the Halt opt
ion.
At line:1
char:21
+
"Eleje"; get-content <<<<
blabla.txt -debug; "Vége"
+ CategoryInfo : OperationStopped: (:)
[Get-Content], ParentCont
ainsErrorRecordException
+ FullyQualifiedErrorId :
ActionPreferenceStop,Microsoft.PowerShell.Comma
nds.GetContentCommand
Láthatjuk, hogy ezzel a paraméterrel a nem megszakító hibák lefolyásáról dönthetünk interaktív módon. Ha a „Halt” opciót választom, akkor kiírta a megállás okát, és a „Vége” nem futott le. Nézzünk, hogy hogyan viselkedik más válasz esetén:
[24] PS C:\old> "Eleje"; get-content blabla.txt -debug; "Vége"
Eleje
Confirm
Cannot find path 'C:\old\blabla.txt' because it does not exist.
[Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help
(default is "Y"):a
Get-Content
: Cannot find path 'C:\blabla.txt' because it does not exist.
At line:1
char:21
+
"Eleje"; get-content <<<<
blabla.txt -debug; "Vége"
+ CategoryInfo : ObjectNotFound:
(C:\blabla.txt:String) [Get-Con
tent], ItemNotFoundException
+ FullyQualifiedErrorId :
PathNotFound,Microsoft.PowerShell.Commands.GetC
ontentCommand
Vége
Ha „Yes” vagy „Yes to All” opciót választom, akkor a cmdlet úgy fut le, ahogy eddig láttuk a nem megszakító hibáknál, azaz kiírta a hibát, de tovább futott. Nézzük a további választási lehetőségünket:
[25] PS C:\old> "Eleje"; get-content blabla.txt -debug; "Vége"
Eleje
Confirm
Cannot find path 'C:\old\blabla.txt' because it does not exist.
[Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help
(default is "Y"):s
[26] PS C:\old >>> 1+1
2
[27] PS C:\old>>> exit
Confirm
Cannot find path 'C:\Users\tibi\blabla.txt' because it does not exist.
[Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help
(default is "Y"):h
Ha a „Suspend” opciót választjuk, akkor a szkript futása megszakad, egy alprompt nyílik és ott bármit begépelhetünk, ellenőrizhetünk, majd az exit kulcsszót beírva visszatérhetünk a fenti állapothoz, azaz újra rákérdez, hogy mi legyen.
Nézzük a másik témánkba vágó „CommonParameter”-t, az –ErrorAction-t:
[44] PS C:\old> "Eleje"; get-content blabla.txt -ErrorAction Stop; "Vége"
Eleje
Get-Content : Cannot find path 'C:\blabla.txt' because it does not exist.
At line:1 char:21
+ "Eleje"; get-content <<<< blabla.txt -ErrorAction Stop; "Vége"
+ CategoryInfo : ObjectNotFound: (C:\blabla.txt:String) [Get-Con
tent], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetC
ontentCommand
Ha a Stop opciót választjuk, akkor a szkript a nem megszakító hibáknál is megszakítódik.
[45] PS C:\old> "Eleje"; get-content blabla.txt -ErrorAction SilentlyContinu
e; "Vége"
Eleje
Vége
A SilentlyContinue opcióval folytatja a szkriptet és nem is ad semmilyen hibajelzést.
[46] PS C:\old> "Eleje"; get-content blabla.txt -ErrorAction Inquire; "Vége"
Eleje
Confirm
Cannot find path 'C:\old\blabla.txt' because it does not exist.
[Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help
(default is "Y"):a
Get-Content
: Cannot find path 'C:\blabla.txt' because it does not exist.
At line:1
char:21
+
"Eleje"; get-content <<<<
blabla.txt -ErrorAction Inquire; "Vége"
+ CategoryInfo : ObjectNotFound:
(C:\blabla.txt:String) [Get-Con
tent], ItemNotFoundException
+ FullyQualifiedErrorId :
PathNotFound,Microsoft.PowerShell.Commands.GetC
ontentCommand
Vége
Ha az Inquire opciót választjuk, akkor - hasonlóan a –debug paraméter használatakor látottakhoz - rákérdez a folytatás mikéntjére.