az egyik legfontosabb része minden jó PowerShell script hibakezelés. Még a legrövidebb szkriptben is, ha képes kezelni a hibákat, segít annak biztosításában, hogy egy váratlan esemény nem fogja tönkretenni a rendszert, amelyen dolgozik. Vegyük az alábbi példát. Minden héten a minta cég (MyCompany.Com) az Emberi Erőforrások egy listát fognak feltölteni, amely megmondja, kinek kell hozzáférnie a Költségadatbázishoz., Ha egy név nem szerepel a HR listán, akkor el fogjuk távolítani a csoportból, és a felhasználó már nem lesz képes naplózni a költségigényeket:
most láthatja, hogy ez hol fog rosszul menni. Egy hét HR nem kap körül, hogy feltölti a listát, vagy, csakúgy, mint mi hamarosan elérheti a listát, a fájlkiszolgáló meghal. A PowerShell hirtelen hibát vét A Tartalomjegyzék parancsmagon, a $ AuthorizedUser változó pedig üres marad. Mivel a szkriptünk nem kezeli a hibákat, továbbra is fut, és nagyon rövid idő alatt minden Felhasználót eltávolított a költségcsoportunkból., Hamarosan a dühös telefonhívások elkezdenek áradni, és az élet egy kicsit kevésbé boldog. Ennek elkerülésének módja az, hogy elkapjuk a hibákat, majd kezeljük azt az eseményt, amely okozta őket (ami ebben az esetben megállítja a szkriptet, és kiabáljon valakivel a HR-ben).
megszüntető és nem megszüntető hibák
az egyik legfontosabb dolog, amit tudni kell a hibák észlelésekor, hogy alapértelmezés szerint csak bizonyos hibákat lehet elkapni. A hibák kétféle módon jönnek létre: a megszüntetés és a megszüntetés. A megszüntetési hiba olyan hiba, amely megállítja a funkciót vagy a műveletet., Ha szintaktikai hibát követ el, vagy elfogy a memória, ez egy megszüntető hiba. A megszüntető hibákat el lehet fogni és kezelni. A nem végződő hibák lehetővé teszik a Powershell folytatását, általában cmdletekből vagy más kezelt helyzetekből származnak. Normál körülmények között nem lehet elkapni őket a try-Catch-végül. A fenti példa Get-Content hibája egy nem végződő hiba.
nem végződő hibák kezelése
Szóval hogyan lehet elkapni egy nem végződő hibát? Alapvetően azt mondja a Powershellnek,hogy úgy kezelje, mint véget. Ehhez használja az ErrorAction paramétert., Minden PowerShell cmdlet támogatja a Hibátcselekvés. Megadásával-ErrorAction megáll a végén egy cmdlet biztosítja, hogy minden hibát dob kezelik végződő lehet fogni. A fenti példánkban a Get-Content sort a következőre fogjuk változtatni:
$AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop
az összes hibát úgy kezeljük, mint a
megszüntetését, az összes hibát úgy is kezelhetjük, mint az ErrorActionPreference változó megszüntetését. Ezt megteheti a szkript, amellyel dolgozik, vagy az egész PowerShell munkamenethez. A parancsfájlba történő beállításhoz készítse el az első sort $ErrorActionPreference = Stop., A munkamenet beállításához írja be a $ErrorActionPreference = Stop parancsot a PowerShell konzolon.
A Megszüntetési hiba
fogása miután biztosította, hogy a elkapni kívánt hibát megszüntetésként fogják kezelni, megpróbálhat egy fogási blokkot a parancs (vagy parancsok) körül, amely hibát okozhat. Az első lépés az, hogy körülvegye a szkript azon részét, amely a hibát megpróbálhatja blokkolni. Példánkban a Get-Content sor a következő lesz:
Try{ $AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop}
közvetlenül a próbablokk után el kell helyeznie egy fogási blokkot a hiba kezeléséhez., A fogási blokk csak akkor érhető el, ha lezárási hiba lép fel, különben figyelmen kívül hagyják. Példánkban e-mailt fogunk küldeni egy adminisztrátornak, hogy azt mondjuk, hogy hiba történt, majd megállítjuk a szkriptet. A Get-Content sor most:
elérése a Hibarekord
miután belépett a fogás blokk elérheti a hibarekord, amely tárolja az aktuális objektum változó,$_. A hibarekordok különböző hasznos tulajdonságokkal rendelkeznek, de a legfontosabb, amelyhez hozzáférni szeretne,$_.Kivétel., Kivételek azok, amelyekkel itt valóban foglalkozunk, amikor elkapjuk és kezeljük a hibákat – kivételek a váratlan esemény, amely a hibát okozta (maga a hibarekord valójában csak egy wrapper a PowerShell felhasználó kivételének bemutatására). Ez a kivétel, hogy elkapjuk a kivételt, amely tartalmazza az összes igazán hasznos információt a problémáról. Ha volt egy további mögöttes probléma, amely a kivételünket okozta, azt $ _ – ON is rögzítik.kivétel.innerexception (és így tovább-a következő mögöttes kivétel $ _ – on tárolódik.kivétel.innerexception.,innerexception stb.). Példánk céljából $_ – t fogunk használni.Kivétel, hogy néhány extra információt az értesítési e-mail, a $_.Kivétel.Üzenet és $_.Kivétel.ItemName tulajdonságok:
speciális kivételek fogása
most, mint példánk áll, elkapunk minden olyan hibát, amely a fájl olvasása során jelentkezik, és ugyanúgy foglalkozik velük. Konkrét kivételeket azonban meg lehet fogni, és másképp kell kezelni őket, de – És ez nagy, de-csak akkor, ha az eredeti hiba megszűnik., Mert a Get-Content parancsmagot dob nem megszüntetéséről hibák (hogy csak kezelni, mint megszüntetéséről segítségével ErrorAction) nem kifejezetten elkapni a másik kivétel, hogy a parancsmag lehet dobni. Ez a PowerShell egyik jellemzője, amely minden nem végződő hibára vonatkozik, függetlenül az ErrorActionPreference-től, és nem módosítható. Mégis, foglalkozhatunk más megszüntető kivételekkel, például egy memóriahibával, amely felbukkanhat az olvasási művelet során. Ennek a példának az alkalmazásában ezt fogjuk tenni.,
a kivétel nevét közvetlenül a fogási kulcsszó után adja meg. Példánkban szeretnénk elkapni egy rendszert.Kivétel nélkül, ha kapunk egyet, akkor a számítógép azonnali újraindításának nem értelmetlen megközelítését veszi igénybe. Mi is tartalmaz egy általános fogási blokk után a fájl nem található blokk elkapni az összes többi kivétel:
végül, a végül
Az utolsó része try Catch végül a végül blokk. Ezt a fogási blokk után azonnal meg kell határozni, és minden alkalommal el kell végezni, függetlenül attól, hogy hiba történt-e vagy sem., Ily módon olyan műveleteket hajthat végre, amelyeket meg kell tenni, függetlenül attól, hogy egy művelet sikeres vagy sikertelen-e. A példánkban fogunk naplózni, hogy egy fájlt olvasni megkísérelték. A Get-Content sor most úgy néz ki, mint: