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?
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
.
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
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
určit příčinu chyby, můžete zobrazit obsah z InvocationInfo
vlastnost pomocí příkazu níže.,
$Error.InvocationInfo
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.
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
.,
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.
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é STOP
sí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
.,
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
.
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.,
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ý.,
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 TypeName
– System.Management.Automation.ItemNotFoundException
.
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.,
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