Adam az Automator

előfordult már fut egy script vagy PowerShell cmdlet, és szembe egy sikoltozó fal szöveg – piros – mint az alább látható?

példa a hibák PowerShell

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.

a $ Error variable üres

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
a hiba a

p> amint az a fenti kimenetből látható, a generált hiba hozzáadásra került a$Errorvá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 $Errorhaszná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 $Error object properties

a hiba oka, hogy a InvocationInfo tulajdonság tartalmát az alábbi paranccsal tekintheti meg.,

$Error.InvocationInfo
az InvocationInfo tulajdonság

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.

a Jegyzettömb folyamat részletei

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.,

hiba van dobva, mert a paraméter érvénytelen

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ó.

példa a nem záró hibára

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 STOParra 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.,

a $ErrorActionPreference

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 ErrorActionparamé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-ContentSTOPértékre van állítva.

Kényszeríti a végződtetési hiba segítségével a ErrorAction paraméter

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 catchblokkok (é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 Catchblokk 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.,

szkript akkor fejeződik be, amikor hiba történt

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.,

a szkript leíró hibaüzenettel fejeződik be

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük