előfordult már fut egy script vagy PowerShell cmdlet, és szembe egy sikoltozó fal szöveg – piros – mint az alább látható?
hibák elsöprő és zavaró. És legfőképpen, a hibákat gyakran nehéz elolvasni, ami lehetetlenné teszi annak meghatározását, hogy mi és hol rontotta el a szkriptet.,
szerencsére van néhány lehetőség a PowerShellben, hogy ezt jobbá tegye a hibakezelés révén. A hibakezelés segítségével a hibák szűrhetők és megjeleníthetők oly módon, hogy könnyebben értelmezhető legyen. A hiba megértése megkönnyíti a további logika hozzáadását a hibakezeléshez.
ebben a cikkben megismerheti a PowerShell hibáit, valamint azt, hogy hogyan lehet elfogni a hibakezelést a PowerShell Try Catch
blocks (and finally
blocks) használatával.,
Tartalomjegyzék
Megértése, Hogy milyen Hibák Munka PowerShell
Mielőtt beleugrik hibakezelés, nézzük először fedezi néhány fogalmak körül hibák a PowerShell. A hibák megértése jobb hibakezelési stratégiákhoz vezethet.
A $Error automatikus változó
PowerShellben sok automatikus változó létezik, ezek közül az egyik a $Error
automatikus változó. A PowerShell a$Error
változót használja a munkamenetben előforduló összes hiba tárolására., A $Error
változó a legfrissebb hibák sorozata.
amikor először megnyit egy PowerShell munkamenetet ,a$Error
változó üres. Ezt úgy ellenőrizheti, hogy felhívja a $Error
változót.
mint látható, a $Error
/ div > változó indul üres., De ha hiba keletkezik, a hiba a $Error
változóba kerül.
az alábbi példában a hibát úgy generálják, hogy szándékosan olyan szolgáltatásnevet kapnak, amely nem létezik.
PS> Get-Service xyzPS> $ErrorPS> $Error.Count
p> amint az a fenti kimenetből látható, a generált hiba hozzáadásra került a$Error
változóhoz.,
A $Error változó a PowerShell munkamenetben generált hibák gyűjteményét tartalmazza. Minden hiba lehet elérni hívja a tömb helyzetét. A legutóbbi hiba mindig a 0. index lesz.
például a legfrissebb hiba a
$Error
használatával érhető el.
a $Error Object Properties
mivel minden PowerShellben egy objektum, a $Error
változó egy objektum, az objektumoknak pedig tulajdonságai vannak., A $Error
változónak a Get-Member
cmdlet értékre történő csővezetékével látnia kell a rendelkezésre álló tulajdonságok listáját.
$Error | Get-Member
a hiba oka, hogy a InvocationInfo
tulajdonság tartalmát az alábbi paranccsal tekintheti meg.,
$Error.InvocationInfo
most ugyanezt teheti a többi tulajdonsággal, és felfedezheti, hogy milyen egyéb információkat talál!
A hibák megszüntetése
a hibák megszüntetése leállítja a végrehajtási folyamatot, amikor a PowerShell vs nem-megszüntető hibák találkoznak. Számos módja van a megszüntetési hiba fordulhat elő. Az egyik példa az, amikor egy nem létező paraméterrel rendelkező parancsmagot hív.,
ahogy az alábbi képernyőképen látható, amikor a Get-Process notepad
parancs fut, a parancs érvényes, a Jegyzettömb folyamat részletei pedig megjelennek.
de ha egy nem létező paramétert használunk, mint például a Get-Process notepad -handle 251
, a parancsmag olyan hibát jelenít meg, hogy a handle
paraméter nem érvényes. Ezután a cmdlet kilép anélkül, hogy bemutatná a notepad
folyamat részleteit.,
nem-Termininating hibák
nem-termininating hibák hibák ez nem akadályozza meg a parancsfájl vagy parancs végrehajtását. Nézze meg például az alábbi kódot. Ez a kód megkapja a fájlnevek listáját a fájllistából.txt fájl. Ezután a szkript átmegy minden fájlnéven, elolvassa az egyes fájlok tartalmát, majd kiadja a képernyőn.
$file_list = Get-Content .\filelist.txtforeach ($file in $file_list) { Write-Output "Reading file $file" Get-Content $file}
a fájllista tartalma.,txt fájl a fájl nevét mutatja az alábbi listában.
File_1.logFile_2.logFile_3.logFile_4.logFile_5.logFile_6.logFile_7.logFile_8.logFile_9.logFile_10.log
de mi van, ha File_6.log valójában nem létezik? Amikor futtatja a kódot, azt várná, hogy hiba fog történni, mert a szkript nem találja a File_6 fájlt.napló. Az alábbiakban egy hasonló kimenet látható.
amint az a fenti eredmény képernyőképéből látható, a szkript képes volt elolvasni az első öt fájlt a listában, de amikor megpróbálta elolvasni a file_6 fájlt.,txt, hiba kerül vissza. A szkript ezután folytatta a többi fájl olvasását a kilépés előtt. Nem szűnt meg.
A $ErrorActionPreference változó
eddig tanultál a megszüntető és nem végződő hibákról, valamint arról, hogy ezek hogyan különböznek egymástól. De, tudta, hogy egy nem megszüntető hibát kényszeríthetünk arra, hogy záró hibaként kezeljük?
A Powershellnek van egy preferencia változóknak nevezett fogalma. Ezeket a változókat a PowerShell sokféle módon viselkedésének megváltoztatására használják. Az egyik ilyen változó neve $ErrorActionPreference
.,
a $ErrorActionPreference
változó a PowerShell nem végződő hibák kezelésének módjának megváltoztatására szolgál. Alapértelmezés szerint a $ErrorActionPreference
érték Continue
értékre van állítva. A $ErrorActionPreference
változó értékének megváltoztatása STOP
arra kényszeríti a PowerShellt, hogy minden hibát megszüntető hibaként kezeljen.
az alábbi kóddal módosíthatja a $ErrorActionPreference
értéket.,
$ErrorActionPreference = "STOP"
Ha többet szeretne megtudni más érvényes $ErrorActionPreference változó értékek, látogasson PowerShell ErrorActionPreference.
most olvassa vissza a cikk nem megszüntető hibák szakaszában használt példát. A szkript módosítható úgy, hogy tartalmazza a $ErrorActionPreference
változását, mint az alább látható kód:
a módosított kód futtatása a fenti módon másképp fog viselkedni, mint korábban, amikor a $ErrorActionPreference
érték a alapértelmezett értékre van állítva.,
amint az a fenti eredmény képernyőképéből látható, a szkript képes volt elolvasni a lista első öt fájlját, de amikor megpróbálta elolvasni a file_6 fájlt.txt, hiba kerül vissza, mert a fájl nem található. Ezután a szkript befejeződött,a többi fájl nem olvasható.,
a
$ErrorActionPreference
érték csak az aktuális PowerShell munkamenetben érvényes. Az új PowerShell munkamenet indítása után az alapértelmezett értékre áll vissza.
az ErrorAction Common paraméter
Ha a $ErrorActionPreference
érték a PowerShell munkamenetre vonatkozik, a ErrorAction
paraméter minden olyan cmdletre vonatkozik, amely támogatja a közös paramétereket. AErrorAction
paraméter ugyanazokat az értékeket fogadja el, mint a$ErrorActionPreference
változó.,
a ErrorAction
paraméter értéke elsőbbséget élvez a$ErrorActionPreference
értékkel szemben.
menjünk vissza és használjuk ugyanazt a kódot az előző példában. De ezúttal aErrorAction
paraméter hozzáadódik aGet-Content
vonalhoz.
a módosított kód futtatása után látni fogja, hogy annak ellenére, hogy a $ErrorActionPreference
Continue
, A szkript továbbra is megszűnik, ha hibát észlelt., A szkript azért fejeződött be, mert a-ErrorAction
paraméter értékeGet-Content
STOP
értékre van állítva.
PowerShell Segítségével Próbálja Elkapni Blokk
ezen A ponton, amit megtudott PowerShell hibákat, illetve, hogy a $ErrorActionPreference
változó ErrorAction
paraméterek munka., Itt az ideje, hogy megismerje a jó dolgokat – a PowerShell Try Catch Finally
blokkokat.
PowerShell try catch
blokkok (és opcionálisfinally block
) egy módja annak, hogy a nettó körül egy darab kódot, és elkapni a hibákat, hogy visszatérjen.
az alábbi kód a Try
utasítás szintaxisát mutatja.
try { <statement list>}catch *]{ <statement list>}finally { <statement list>}
The Try
block tartalmazza azt a kódot, amelyet a PowerShell” megpróbál ” és a hibák megfigyelésére., Ha a Try
blokk kódja hibát észlel, a hiba hozzáadódik a $Error
változóhoz, majd átkerül a Catch
blokkba.
aCatch
blokk tartalmazza a végrehajtandó műveleteket, amikor hibát kap aTry
blokkból. Lehet többCatch
blokk egyTry
utasítás.
aFinally
blokk tartalmazza azt a kódot, amely a Try
utasítás végén lesz., Ez a blokk fut, függetlenül attól, hogy hiba történt-e vagy sem.
Catching Non-Specific Errors (Catch-All)
a simple Try
statement contains a Try
and a Catch
block. AFinally
blokk opcionális.
például egy nem specifikus kivétel elkapásához a Catch
paraméternek üresnek kell lennie. Az alábbi példakód ugyanazt a szkriptet használja, amelyet a $ErrorActionPreference változó szakaszban használtak, de a Try Catch
blokkok használatához módosították.,
amint az az alábbi kódból látható, ezúttal aforeach
utasítás aTry
blokkban található. Ezután egy Catch
blokk tartalmazza aAn Error Occurred
karakterlánc megjelenítéséhez szükséges kódot, ha hiba történt. A Finally
blokk kódja csak törli a $Error
változót.
a fenti kód, a PowerShell futtatása után, megadja ezt a kimenetet az alábbiakban.,
a fenti kimenet azt mutatja, hogy a szkript hibát észlelt, lefuttatta a kódot a Catch
blokk, majd megszűnik.
a hibát kezelték, ami a hibakezelés pontja volt. A megjelenő hiba azonban túl általános volt. Egy leíróbb hiba megjelenítéséhez hozzáférhet aException
aTry
blokk által átadott hiba tulajdonságához.,
az alábbi kódot módosítják, konkrétan a Catch
blokkban lévő kódot, hogy megjelenítse a kivétel üzenetet a csővezetéken áthaladó aktuális hibáról – $PSItem.Exception.Message
Ez alkalommal, amikor a fenti módosított kód fut, a megjelenített üzenet sokkal leíróbb.,
speciális hibák fogása
vannak olyan esetek, amikor egy fogás-minden hiba kezelése nem a legmegfelelőbb megközelítés. Talán azt szeretné, hogy a szkript olyan műveletet hajtson végre, amely a felmerült hiba típusától függ.
hogyan határozza meg a hiba típusát? Az utolsó hiba TypeName
értéke Exception
tulajdonságának ellenőrzésével., Például az előző példa hibatípusának megtalálásához használja ezt a parancsot:
$Error.Exception | Get-Member
a fenti kód eredménye az alábbi képernyőképnek tűnik. Mint látható ,aTypeName
érték jelenik meg – System.Management.Automation.ItemNotFoundException
.
most, hogy ismeri a hiba típusát, amelyet el kell ragadnia, módosítsa a kódot, hogy kifejezetten elkapja., Amint az alábbi módosított kódból látható, most két Catch
blokk található. Az elsőCatch
blokk elfogja egy adott típusú hibát (System.Management.Automation.ItemNotFoundException
). Ezzel szemben a másodikCatch
blokk tartalmazza az Általános, catch-all hibaüzenetet.
az alábbi képernyőkép a fenti módosított kód kimenetét mutatja.,
következtetés
ebben a cikkben a PowerShell hibáiról tanultál, a tulajdonságok, valamint hogyan lehet meghatározni a hiba konkrét típusát. Azt is megtanulta a különbséget, hogy a$ErrorActionPreference
változó és aErrorAction
paraméter hogyan befolyásolja a PowerShell a nem végződő hibákat.,
azt is megtanulta, hogyan kell használni a PowerShell Try Catch Finally
blokkokat a hibakezelés végrehajtásához, akár konkrét hibák, akár minden fogás megközelítés esetén.
Az ebben a cikkben bemutatott példák csak a Try Catch Finally
blokkok működésének alapjait mutatják be. Az a tudás, amelyet remélem, hogy ebben a cikkben szerzett, meg kell adnia a kezdő blokkokat a szkriptek hibakezelésének megkezdéséhez.,
további olvasás
- About_Try_Catch_Finally
- About_Automatic_Variables
- vissza az alapokhoz: a PowerShell foreach hurok
- vissza az alapokhoz: a PowerShell objektumok megértése