Jedním z klíčových částí každého dobrého PowerShell skript je zpracování chyb. Dokonce i v nejkratším skriptu pomáhá schopnost zvládnout chyby zajistit, aby neočekávaná událost nezničila systém, na kterém pracujete. Vezměte si příklad níže. Každý týden v naší ukázkové společnosti (MyCompany.Com) Lidské zdroje nahrají seznam, který nám říká, kdo by měl mít přístup k databázi výdajů., V případě, že název není v seznamu z HR budeme odstranit ze skupiny a, že uživatel nebude moci přihlásit úkor tvrdí:

Nyní, můžete vidět, kde to jde špatně. Jeden týden se HR nedostane k nahrání seznamu, nebo, stejně jako se chystáme vstoupit do seznamu, souborový server zemře. Najednou PowerShell hodí chybu na cmdlet Get-Content a proměnná $ AuthorizedUser zůstává prázdná. Protože náš skript neřeší chyby, pokračuje v běhu a ve velmi krátkém čase odstranil každého uživatele z naší skupiny výdajů., Brzy se rozzuřené telefonní hovory začnou zaplavovat a život bude o něco méně šťastný. Způsob, jak se tomu všemu vyhnout, je zachytit chyby a poté zvládnout událost, která je způsobila (což je v tomto případě zastavení skriptu a výkřik na někoho v HR).

Ukončovací a nekončící chyby

jednou z klíčových věcí, které je třeba vědět při chytání chyb, je to, že ve výchozím nastavení lze zachytit pouze určité chyby. Chyby se vyskytují ve dvou typech-končící a nekončící. Ukončující chyba je chyba, která zastaví funkci nebo operaci., Pokud uděláte chybu syntaxe nebo dojde paměť, jedná se o ukončující chybu. Ukončení chyby mohou být chyceny a zpracovány. Nekončící chyby umožňují Powershell pokračovat a obvykle pocházejí z cmdletů nebo jiných spravovaných situací. Za normálních okolností nemohou být chyceni Try-Catch-konečně. Chyba Get-Content ve výše uvedeném příkladu je nekončící chyba.

léčba nekončících chyb jako ukončování

tak jak chytíte chybu, která není ukončena? V podstatě, řeknete Powershellovi, aby s ním zacházel jako s ukončením. Chcete-li to provést, použijte parametr Chybyakce., Každý PowerShell cmdlet podporuje chybu. Zadáním-ErrorAction Stop na konci cmdlet zajistíte, že všechny chyby, které hodí, jsou považovány za ukončující a mohou být chyceny. V našem příkladu budeme měnit naše Get-Obsah řádku:

$AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop

Ošetřovat Všechny Chyby jako Ukončení

je také možné, aby léčit všechny chyby jako ukončení pomocí ErrorActionPreference proměnné. Můžete to udělat buď pro skript, se kterým pracujete, nebo pro celou relaci PowerShell. Chcete-li jej nastavit ve skriptu, proveďte první řádek $ErrorActionPreference = Stop., Chcete-li jej nastavit pro relaci, zadejte $ErrorActionPreference = Stop na konzoli PowerShell.

Chytání Ukončení Chyba

Jakmile budete mít zajištěno, že chyba, kterou se snaží chytit je bude zacházeno jako ukončení, můžete vytvořit Try Catch bloku kolem příkaz (nebo příkazy), což by mohlo způsobit chyby. První fází je obklopení části skriptu, která může chybu hodit pokusným blokem. V našem příkladu Get-line Obsahu se stane:

Try{ $AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop}

Ihned po bloku Try musíte umístit blok Catch se vypořádat s chybou., Blok úlovku je přístupný pouze v případě, že dojde k chybě ukončení, jinak je ignorován. V našem příkladu budeme e-mailem admin říci, že došlo k chybě a pak zastavit skript. Náš řádek Get-Content je nyní:

přístup k záznamu chyb

jakmile jste uvnitř bloku úlovku, můžete přistupovat k záznamu chyb, který je uložen v aktuální proměnné objektu,$_. Chybové záznamy mají různé užitečné vlastnosti, ale hlavní, ke kterému budete chtít přistupovat, je $_.Výjimek., Výjimky jsou to, co jsme opravdu jedná, jak jsme se chytit, a vypořádat se s chybami – výjimky jsou neočekávané události, která způsobila chybu (chyba se záznam sám o sobě je vlastně opravdu jen wrapper pro prezentaci výjimkou PowerShell user). Je to výjimka, kterou chytáme, a výjimka, která obsahuje všechny skutečně užitečné informace o problému. Pokud se vyskytl další základní problém, který způsobil naši výjimku,je také zaznamenán na$_.výjimek.innerexception (a tak dále-další základní výjimka je uložena na $_.výjimek.innerexception.,innerexception atd.). Pro účely našeho příkladu budeme používat $_.Výjimka dát nějaké další informace do našeho oznámení e-mailu, pomocí $_.Výjimek.Zpráva a $_.Výjimek.ItemName vlastnosti:

Chytání Výjimek

Nyní, jako náš příklad stojí potkáváme nějaké chyby, které se vyskytují v průběhu čtení souboru a vyrovnat se s všechny z nich stejným způsobem. Můžete však chytit konkrétní výjimky a vypořádat se s nimi jinak, ALE – a je to velké, ale-pouze v případě, že původní chyba končí., Protože Dostat-Obsahu rutinu hody non-ukončení chyby (to, že máme jen zacházet jako ukončení pomocí ErrorAction) nemůžeme konkrétně chytit různé výjimky, které rutiny může hodit. Jedná se o funkci PowerShell a vztahuje se na jakoukoli nekončící chybu, bez ohledu na Chybupreference a nelze ji změnit. Přesto se můžeme vypořádat s dalšími ukončujícími výjimkami, jako je chyba mimo paměť, která by se mohla objevit během operace čtení. Pro účely tohoto příkladu to uděláme.,

zachyťte konkrétní chyby ukončení zadáním názvu výjimky bezprostředně za klíčovým slovem Catch. V našem příkladu chceme chytit systém.OutOfMemory výjimka a, pokud dostaneme jeden, bude mít žádný nesmysl přístup k restartování počítače okamžitě. Budeme také zahrnovat obecné bloku catch po náš soubor nebyl nalezen blok chytit všechny ostatní výjimky:

Konečně, Pomocí Konečně

poslední část se Snaží Chytit Konečně je Konečně bloku. To musí být definováno ihned po zablokování a běží pokaždé, bez ohledu na to, zda došlo k chybě nebo ne., Tímto způsobem můžete provádět akce, které je třeba provést bez ohledu na to, zda operace uspěje nebo selže. V našem příkladu budeme zaznamenávat, že byl pokus o čtení souboru. Naše linka Get-Content nyní vypadá takto:

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *