Adam Automator (Čeština)

Už jste někdy spustit skript nebo rutiny prostředí PowerShell a získat konfrontováni s křikem zdi textu – v červené barvě – jako na obrázku níže?

Příklad chyby v PowerShell

Chyby mohou být ohromující a matoucí. A hlavně, chyby jsou často těžko čitelné, což dělá určení toho, co a kde se skript pokazil, téměř nemožné.,

naštěstí máte v PowerShellu několik možností, jak to zlepšit pomocí manipulace s chybami. Pomocí manipulace s chybami lze chyby filtrovat a zobrazovat tak, aby bylo snazší dávat smysl. A pochopení chyby usnadňuje přidání další logiky k manipulaci s chybami.

V tomto článku se dozvíte o chybách v PowerShell a jak mohou být zachyceny provádět zpracování chyb pomocí PowerShell Try Catch bloky (a finally bloky).,

Obsah

Pochopení toho, Jak Chyby Práce v prostředí PowerShell

Před potápění do zpracování chyb, pojďme se nejprve pokrývají několik konceptů kolem chyby v PowerShell. Porozumění chybám může vést k lepším strategiím zpracování chyb.

Automatická proměnná $Error

v PowerShell je mnoho automatických proměnných a jednou z nich je automatická proměnná $Error. PowerShell používá proměnnou$Error pro uložení všech chyb, které se vyskytují v relaci., Proměnná$Error je pole chyb seřazených podle nejnovějších.

při prvním otevření relace PowerShell je proměnná $Error prázdná. Můžete to zkontrolovat voláním proměnné$Error.

$Chyba proměnná je prázdná

Jak můžete vidět, $Error proměnná začíná prázdné., Jakmile je však chyba vygenerována, chyba bude přidána a uložena do proměnné$Error.

v níže uvedeném příkladu je chyba generována záměrně získáním názvu služby, který neexistuje.

PS> Get-Service xyzPS> $ErrorPS> $Error.Count
chyba je přidán do $Chybová proměnná.

Jak můžete vidět z výstupu výše, vygenerovaný chybový byl přidán do prvku $Error proměnné.,

proměnná $Error obsahuje sbírku chyb generovaných v relaci PowerShell. Ke každé chybě lze přistupovat voláním pozice pole. Poslední chyba bude vždy na indexu 0.

například nejnovější chybu lze načíst pomocí $Error.

$Error Object Properties

Vzhledem k tomu, všechno v PowerShell je objekt, $Error proměnná je objekt, a objekty mají vlastnosti., Vložením proměnné$Error doGet-Member cmdlet byste měli vidět seznam dostupných vlastností.

$Error | Get-Member
$Error object properties

určit příčinu chyby, můžete zobrazit obsah z InvocationInfo vlastnost pomocí příkazu níže.,

$Error.InvocationInfo
InvocationInfo majetku

Teď, mohli byste udělat to samé s další vlastnosti a zjistit, jaké další informace, které můžete najít!

chyby ukončení

chyby ukončení zastaví tok provádění, když se vyskytnou chyby PowerShell vs non-terminating. Existuje několik způsobů, jak může dojít k chybě ukončení. Jedním z příkladů je, když zavoláte cmdlet s parametrem, který neexistuje.,

jak budete z obrazovky níže, když běží příkaz Get-Process notepad, příkaz je platný a zobrazí se podrobnosti o procesu poznámkového bloku.

poznámkový blok proces detaily

Ale, když je parametr, který neexistuje, je používán jako Get-Process notepad -handle 251, rutiny se zobrazí chyba, že handle parametr není platný. Poté cmdlet ukončí bez zobrazení podrobností procesunotepad.,

Chyba je vyvolána, protože parametr je neplatný

Non-Ukončení Chyb

Non-ukončení chyby jsou chyby, které nemají zastavení provádění skriptu nebo příkazu. Podívejte se například na níže uvedený kód. Tento kód dostane seznam názvů souborů ze seznamu souborů.txt soubor. Poté skript prochází každým názvem souboru, přečte obsah každého souboru a odešle jej na obrazovku.

$file_list = Get-Content .\filelist.txtforeach ($file in $file_list) { Write-Output "Reading file $file" Get-Content $file}

obsah seznamu souborů.,txt soubor jsou názvy souborů zobrazené v níže uvedeném seznamu.

File_1.logFile_2.logFile_3.logFile_4.logFile_5.logFile_6.logFile_7.logFile_8.logFile_9.logFile_10.log

ale co když File_6.log vlastně neexistoval? Při spuštění kódu byste očekávali, že dojde k chybě, protože skript nemůže najít Soubor_6.protokol. Zobrazí se podobný výstup uvedený níže.

Příklad non-zastavení chyba

Jak můžete vidět z obrazovky výsledku výše, skript byl schopen přečíst prvních pět souborů v seznamu, ale když se to snažil přečíst soubor File_6.,txt, chyba je vrácena. Skript pak pokračoval ve čtení ostatních souborů před ukončením. Neskončila.

proměnná $ErrorActionPreference

dosud jste se dozvěděli o chybách ukončení a ukončení a o tom, jak se od sebe liší. Věděli jste však, že nekončící chyba může být nucena být považována za ukončující chybu?

PowerShell má koncept nazvaný preferenční proměnné. Tyto proměnné se používají ke změně toho, jak se PowerShell chová mnoha různými způsoby. Jedna z těchto proměnných se nazývá $ErrorActionPreference.,

proměnná$ErrorActionPreference se používá ke změně způsobu, jakým PowerShell zachází s nekončícími chybami. Ve výchozím nastavení je hodnota $ErrorActionPreference nastavena na Continue. Změna hodnoty $ErrorActionPreference proměnné STOPsíly PowerShell k léčbě všechny chyby jako ukončení chyby.

pomocí níže uvedeného kódu změňte hodnotu $ErrorActionPreference.,

$ErrorActionPreference = "STOP"

dozvědět Se více o jiné platné $ErrorActionPreference hodnoty proměnných, navštivte PowerShell ErrorActionPreference.

Nyní, vrátit se k příkladu použity v Non-Ukončení Chyby v tomto článku v části. Skript je upraven tak, aby zahrnout měnit v $ErrorActionPreference kód je uvedeno níže:

spuštění upravený kód výše se bude chovat jinak, než předtím, když $ErrorActionPreference, hodnota je nastavena na výchozí hodnotu Continue.,

Vynucení ukončení chybová pomocí $ErrorActionPreference proměnná

Jak můžete vidět z obrazovky výsledku výše, scénář byl schopen přečíst prvních pět souborů v seznamu, ale když se to snažil přečíst soubor File_6.txt, chyba je vrácena, protože soubor nebyl nalezen. Poté se skript ukončí a zbytek souborů se nečte.,

hodnota$ErrorActionPreference je platná pouze v aktuální relaci PowerShell. Po spuštění nové relace PowerShell se resetuje na výchozí hodnotu.

ErrorAction Společný Parametr

Pokud $ErrorActionPreference, hodnota se použije na PowerShell session, ErrorAction parametr se vztahuje na jakoukoli rutinu, která podporuje společné parametry. Parametr ErrorAction přijímá stejné hodnoty jako proměnná $ErrorActionPreference.,

hodnota parametruErrorAction má přednost před hodnotou$ErrorActionPreference.

vraťme se a použijeme stejný kód v předchozím příkladu. Tentokrát se však do řádkuErrorAction přidá parametrGet-Content.

Po spuštění upravený kód, uvidíte, že i když $ErrorActionPreference je nastavena na Continue, skript stále ukončeno, jakmile to došlo k chybě., Skript ukončen, protože -ErrorAction hodnota parametru v Get-Content je nastavena na STOP.

Vynucení ukončení chybová pomocí ErrorAction parametr

Pomocí PowerShell Try Catch Bloky

V tomto bodě, jste se naučili o PowerShell chyby a jak $ErrorActionPreference proměnná a ErrorAction parametry práce., Nyní je čas se dozvědět o dobrých věcech-bloky PowerShell Try Catch Finally.

PowerShell try catch bloky (a volitelně finally block) jsou způsobem, jak vrhají síť kolem kus kódu a chytit všechny chyby, které se vrátit.

níže uvedený kód ukazuje syntaxi příkazu Try.

try { <statement list>}catch *]{ <statement list>}finally { <statement list>}

Try blok obsahuje kód, který chcete PowerShell „vyzkoušet“ a monitor za chyby., Pokud kód v Try bloku dojde k chybě, chyba je přidán do $Error proměnné a pak přešel do Catch blok.

Catch blok obsahuje akce, které se mají provést,když obdrží chybu z bloku Try. Může existovat více Catch bloků v Try prohlášení.

Finally blok obsahuje kód, který bude na konci Try prohlášení., Tento blok běží bez ohledu na to, zda byla chyba odpojena.

Chytání Non-Specifické Chyby (Catch-All)

jednoduchá Try prohlášení obsahuje Try Catch blok. Blok Finally je volitelný.

například pro zachycení nespecifické výjimky by měl být parametr Catch prázdný. Níže uvedený příklad kódu používá stejný skript, který byl použit v sekci proměnné $ ErrorActionPreference, ale upraven tak, aby používal bloky Try Catch.,

Jak můžete vidět z kódu níže, tentokrát, foreach prohlášení je uzavřen uvnitř prvku Try blok. Poté blok Catch obsahuje kód pro zobrazení řetězce An Error Occurred pokud došlo k chybě. Kód v bloku Finally právě vymaže proměnnou$Error.

výše uvedený kód Po spuštění v PowerShell vám poskytne tento výstup uvedený níže.,

Skript ukončen, když došlo k chybě

výstup výše uvedeného vyplývá, že skriptu došlo k chybě, běžel kód uvnitř Catch blok, a pak se ukončí.

chyba byla zpracována, což byl bod zpracování chyb. Zobrazená chyba však byla příliš obecná. Chcete-li zobrazit popisnější chybu, můžete přistupovat k vlastnosti Exception chyby, která byla předána blokem Try.,

kód níže je upravený, konkrétně kód uvnitř Catch blok, zobrazí se zpráva o výjimce ze současných chyb, které byl předán dolů potrubí – $PSItem.Exception.Message

Tento čas, kdy upravený výše uvedený kód je spuštěn, zobrazí zpráva je mnohem více popisný.,

Skript ukončen s popisnou chybovou zprávu

Chytání Konkrétních Chyb

jsou chvíle, kdy catch-all zpracování chyb není ten nejvhodnější přístup. Možná chcete, aby váš skript provedl akci, která závisí na typu chyby, která se vyskytne.

Jak určujete typ chyby? Zaškrtnutím TypeName hodnota Exception vlastnost poslední chyba., Například, najít typ chyby z předchozího příkladu, použijte tento příkaz:

$Error.Exception | Get-Member

výsledkem výše uvedený kód by vypadat jako na obrázku níže. Jak vidíte, zobrazí se hodnota TypeNameSystem.Management.Automation.ItemNotFoundException.

se chybová TypeName hodnota

Nyní, že víte, chyby typu, že potřebujete zachytit, upravit kód, aby se chytit, to konkrétně., Jak vidíte z upraveného kódu níže, nyní existují dva blokyCatch. První blok Catch zachycuje specifický typ chyby (System.Management.Automation.ItemNotFoundException). Naproti tomu druhý blok Catch obsahuje obecnou chybovou zprávu catch-all.

níže uvedený snímek obrazovky zobrazuje výstup upraveného kódu výše.,

Skript ukončen s konkrétní chybovou zprávu

Závěr

V tomto článku, jste se dozvěděli o chyby v PowerShell, jeho vlastnosti, a jak můžete zjistit chybu, je zvláštní typ. Také jste se dozvěděl rozdíl mezi tím, jak $ErrorActionPreference proměnná a ErrorAction parametr ovlivňuje, jak PowerShell zachází-ukončení chyby.,

také Jste se naučili, jak používat PowerShell Try Catch Finally bloky provádět zpracování chyb, ať už pro konkrétní chyby, nebo catch-all přístup.

příklady, které jsou uvedeny v tomto článku, pouze ukazuje základy toho, jak Try Catch Finally bloky práce. Poznání, že doufám, že jste získali v tomto článku, by vám měl poskytnout startovní bloky začít uplatňovat ošetření chyb ve skriptech.,

Další Čtení

  • About_Try_Catch_Finally
  • About_Automatic_Variables
  • Zpět k Základům: PowerShell foreach Smyčky
  • Zpět k Základům: Porozumění PowerShell Objekty

Napsat komentář

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