Jak používat PowerShell Vyzkoušejte Catch Final k řešení chyb

15. července 2021 10258 Pohledy Další důležité informace o prostředí PowerShell Zkuste

PowerShell Zkus chytit blok se používá ke zpracování chyb ve skriptování PowerShellu. Při použití PowerShellu Zkus chytit bloku pro skriptování můžete dosáhnout následujícího:

  1. Zajistěte, aby skript pokračoval v běhu i přes chybu
  2. Zobrazovat a zpracovávat chybové zprávy lépe

V této příručce se naučíte používat Powershell Zkus chytit bloky pro zpracování ukončovacích chybových zpráv v PowerShellu. Kromě toho se dozvíte, jak zahrnout Konečně blok v a Zkus chytit blok.

Průvodce začíná syntaxí souboru Zkus chytit blok.

Procházet témata příspěvků

PowerShell Zkus chytit Syntax

PowerShell Vyzkoušejte syntaxi Catch

Syntaxe prostředí PowerShell Zkus chytit je…

|_+_|

The Snaž se je část bloku, kterou má PowerShell sledovat na chyby. Toto je blok s původními skripty, který může vrátit ukončovací chybu.

Když dojde k chybě v bloku Try, PowerShell uloží chybu do automatické proměnné $Error (více o tom později).

Na druhou stranu, t on chytit prohlášení prostředí PowerShell Zkus chytit blok zpracovává chyby generované v bloku try. Můžete také určit typy chyb, které jsou zpracovány v rámci Chytit výpisový blok.

The Konečně blok lze použít k uvolnění zdrojů, které již skript nepotřebuje.

Běžné typy chyb výjimek v prostředí PowerShell Zkus chytit

Typy chyb v PowerShell Zkuste Catch

V bloku Try Catch PowerShell můžete zpracovat různé typy chyb. Můžete například ošetřit konkrétní chyby.

Navíc můžete zpracovat obecné chybové zprávy. Chcete-li však zvládnout konkrétní typy chyb, musíte znát typ chyby.

dále v této příručce se dozvíte, že chybové zprávy se ukládají do automatické proměnné $error. Kromě toho mohou být chyby také uloženy v proměnné kanálu $_.

Navíc chyby uložené v automatické proměnné $error se ukládají do pole. Abychom to vysvětlili, spusťte příkaz, který vrátí ukončovací chybovou zprávu:

Chcete-li vymazat všechny chyby dříve uložené v $chyba automatická proměnná, než spustíte níže uvedený příkaz, nejprve spusťte $error.Clear() příkaz. |_+_| Neexistuje žádný protokol událostí s názvem Systerr, takže příkaz v bloku Try vyvolá chybovou zprávu.

Překvapivě příkaz nezobrazil žádné chybové hlášení. Co se tedy stalo s chybovou zprávou?

Ukládá se do automatické proměnné $error! Chcete-li zobrazit chybu z posledního příkazu uloženého v proměnné $error, spusťte příkaz…

|_+_|

Výsledek příkazu zobrazí podrobnosti o chybě uložené v automatické proměnné $error. Chybové informace mají sekci nazvanou FullyQualifiedErrorId .

Pro tuto konkrétní chybu, FullyQualifiedErrorId má dvě sady informací – System.InvalidOperationException a Microsoft.PowerShell.Commands.GetEventLogCommand .

Informace, které nás zajímají, jsou System.InvalidOperationException . Toto je typ chyby, kterou můžete chytit v bloku PowerShell Try Catch.

Chcete-li získat název této výjimky PowerShell, spusťte níže uvedený příkaz:

|_+_|

Je to tady, System.InvalidOperationException !

V několika následujících podsekcích budu diskutovat o běžných chybách PowerShell Try Catch Exception.

PowerShell Zkuste Catch CommandNotFoundException Chyba

Pokud spustíte příkaz, který v PowerShell nebo Microsoft Command Prompt neexistuje, zobrazí se chybová zpráva. Pokud například spustíte Get-File obdržíte chybovou zprávu, protože tento příkaz není platnou rutinou prostředí PowerShell.

Zde je snímek obrazovky s výsledkem příkazu v PowerShell…

PowerShell Zkuste Catch CommandNotFoundException Error

Jak můžete vidět na snímku obrazovky, typ výjimky (FullyQualifiedErrorId ) je CommandNotFoundException .

Vzhledem k tomu, že se jedná o ukončovací chybu, přestane váš skript pokračovat. Chcete-li této chybě zabránit v ukončení vašeho skriptu, zabalte příkaz do a Zkus chytit blok.

Pokud tuto chybu zabalíme do bloku Try Catch PowerShell, PowerShell chybu potlačí. Navíc to zastaví ukončení vašeho skriptu.

I když je chyba potlačena, je uložena do proměnné $error. Jako obvykle, než spustíte níže uvedený příkaz, nejprve vymažte chyby uložené v proměnné $error.

|_+_|

Pokud chcete spustit příkaz v PowerShell místo PowerShell ISE, zadejte příkazy do jednoho řádku, jak je uvedeno níže:

|_+_|

Poté pro zobrazení chyby spusťte...

|_+_|

Jak jsem zmínil v hlavním úvodu k této části, chcete-li zobrazit ID výjimky pro tuto chybu, spusťte níže uvedený příkaz:

|_+_|

Úplný název výjimky je System.Management.Automation.CommandNotFoundException .

PowerShell Zkuste Catch ManagementObjectNotFoundException Chyba

Když spustíte příkaz ve vzdálené relaci PS s nesprávnými informacemi, PowerShell vrátí a ManagementObjectNotFoundException chyba.

Typický scénář je, když se připojíte k Office 365 pomocí PowerShellu. Poté spusťte příkaz Get-User, ale zadejte nesprávného uživatele identita .

PowerShell Zkuste Catch ManagementObjectNotFoundException Error

Chcete-li tuto chybu zachytit pomocí PowerShell Try Catch, použijte příkaz podobný tomu níže:

|_+_| Chytání ManagementObjectNotFoundException chyba s PowerShell Zkuste, Catch je obzvláště složitý. Musíte použít ErrorAction parametr a specifikujte Stop . V opačném případě se chyba zobrazí i při použití příkazu Try, Catch.

Nakonec, chcete-li získat název výjimky, použijte příkaz níže:

|_+_|

Příkaz vrátí typ výjimky jako System.Management.Automation.RemoteException . Takže, co je ManagementObjectNotFoundException ?

ManagementObjectNotFoundException je důvodem výjimky potvrzené příkazem níže:

|_+_|

PowerShell Zkuste Catch UnauthorizedAccessException Chyba

Další běžnou chybou výjimky PowerShellu je UnauthorizedAccessException . Tento typ chyby je vyvolán při pokusu o přístup k položce, u které nemáte alespoň oprávnění ke čtení.

Pro ilustraci tohoto příkladu jsem odepřel ověřeným uživatelům přístup ke konkrétnímu souboru na mém počítači.

PowerShell Zkuste Catch UnauthorizedAccessException Error

Nyní, když se pokusím získat přístup k souboru pomocí příkazu Get-Content, obdržím zprávu o zamítnutí přístupu.

|_+_|

Chcete-li zastavit zobrazování této chyby, spusťte příkaz v bloku PowerShell Try Catch, jak je znázorněno níže…

|_+_|

Bohužel, výše uvedený příkaz nezastaví zobrazování chyby. Důvodem je, že se nejedná o ukončovací chybu.

Chcete-li zastavit zobrazování chyby, zahrňte ErrorAction parametr a specifikujte Stop .

|_+_|

Nyní příkaz potlačí chybu. Chcete-li zobrazit typ výjimky, spusťte příkaz níže…

|_+_|

Typ výjimky je System.UnauthorizedAccessException .

Existuje více typů chyb výjimek, než je popsáno v této části. Popsal jsem pouze nejběžnější typy výjimek.

Jak zachytit konkrétní výjimky pomocí PowerShellu Vyzkoušejte Catch

Jak zachytit konkrétní výjimky pomocí PowerShellu Vyzkoušejte Catch

Poslední část pojednávala o běžných výjimkách PowerShellu a o tom, jak najít typ výjimky. Tato část se bude zabývat tím, jak tyto informace použít k zachycení konkrétních typů chybových zpráv.

V sekci syntaxe této příručky jsem řekl, že obecná syntaxe PowerShell Try Catch Konečně je…

|_+_|

V bloku catch syntaxe můžete vidět [typ chyby]. Zde zadáte typ chyby, kterou chcete v tomto bloku zachytit.

Chcete-li například zachytit chyby UnauthorizedAccessException, použijte níže uvedená prohlášení…

|_+_|

Chcete-li spustit příkaz v prostředí PowerShell, zadejte příkazy na jednom řádku. První část příkazu – $error.Clear() – vymaže všechny chyby uložené v proměnné $error.

|_+_|

Jak přidat více Chytit Bloky V PowerShellu Zkus chytit Tvrzení

V úvodu této sekce jsem vám ukázal, jak zachytit konkrétní typ výjimky v Chytit blok. Můžete zadat více

Zde je příklad…

|_+_|

V tomto příkladu první chytit blok zpracovává zadané typy výjimek. Navíc ten druhý chytit blok handles zpracovává obecné chyby.

Jak extrahovat výjimku chyb pomocí PowerShell Zkuste Catch

Poslední podsekce se zabývala tím, jak specifikovat více bloků catch pro zpracování různých typů výjimek. V této podsekci se dozvíte, jak extrahovat podrobnosti o chybě ve výjimce.

Abych to ilustroval, použiji příklad, který jsem použil dříve. Spusťte tento příkaz prostředí PowerShell v prostředí PowerShell.

|_+_|

Nyní spusťte $error sám…

|_+_|

Ačkoli je v proměnné $error uloženo více informací, skutečná chybová zpráva je zvýrazněna na snímku obrazovky níže.

Jak extrahovat podrobnosti o chybě pomocí PowerShellu Zkuste Catch

Pokud chcete tuto chybu zaprotokolovat do textového souboru, musíte zaznamenat pouze skutečné podrobnosti o chybě. Chcete-li tuto chybu extrahovat, použijte příkaz níže:

|_+_|

Příkaz extrahuje skutečnou chybovou zprávu Přístup k cestě ‚D:PS-Tutorialfolder-names.txt‘ je odepřen.

Tuto chybovou zprávu můžete zapsat do souboru protokolu vložením a Out-File příkaz v bloku Catch.

|_+_| Zahrnul jsem Připojit parametr v Out-File povolit protokolování více záznamů bez přepsání předchozích záznamů.

Aby bylo snadné porozumět poslednímu příkazu, přepíšu jej ve formátu skriptu níže…

|_+_|

Jak zahrnout A Konečně Blokovat do PowerShellu Zkus chytit Tvrzení

Jak zahrnout konečně blok do PowerShellu Zkuste příkaz Catch

Můžete zahrnout a Konečně blokovat do PowerShellu Zkus chytit Tvrzení. Syntaxe je

|_+_|

The Konečně blok lze použít k uvolnění zdrojů, které již skript nepotřebuje.

Blok Konečně se spustí, i když použijete CTRL+C k zastavení skriptu. Blok se také spustí, pokud klíčové slovo Exit zastaví skript z bloku Catch.

V posledním příkladu jsem měl příkaz, který zapisuje chybový protokol do textového souboru v Chytit blok. Nejlepším místem pro toto prohlášení je však a Konečně blok.

Podívejte se na upravený skript níže…

|_+_|

Další užitečné informace o prostředí PowerShell Zkuste Catch

Další důležité informace o prostředí PowerShell Zkuste

V této části se podělím o několik jednoduchých, ale užitečných informací o PowerShell Try Catch.

Jak vymazat PowerShell Zkuste automatickou proměnnou Catch $Error

Automatická proměnná $error má a Průhledná Metoda. Tuto metodu můžete použít k vymazání všech chyb uložených v automatické proměnné $error.

Chcete-li vymazat všechny chyby uložené v automatické proměnné $error pro aktuální relaci PowerShellu, spusťte níže uvedený příkaz.

|_+_|

Jak zobrazit vlastní chybovou zprávu v PowerShell Zkuste Catch Block

Chcete-li zobrazit vlastní chybovou zprávu v PowerShell Try Catch Block, použijte slovo Throw. Zde je příklad…

|_+_|

Zde je výsledek tohoto skriptu v PowerShell ISE.

Jak zobrazit vlastní chybovou zprávu v PowerShell Zkuste Catch Block

Jak získat informace o chybě CategoryInfo v PowerShell Zkuste Catch

Automatická proměnná $error má vlastnost nazvanou CategoryInfo. Chcete-li zobrazit tuto vlastnost a další vlastnosti a metody, spusťte příkaz níže…

|_+_|

Zavolá se jedna z vlastností vrácených posledním příkazem Informace o kategorii .

Chcete-li získat přístup k těmto informacím, spusťte níže uvedený příkaz.

|_+_|

Tento příkaz vrací několik podvlastností.

Jak získat informace o chybě CategoryInfo v PowerShell Zkuste Catch

Ke každé z těchto dílčích vlastností lze přistupovat přidáním názvu dílčí vlastnosti za tečku. Chcete-li například zobrazit dílčí vlastnosti Reason, spusťte níže uvedený příkaz.

|_+_|

Jak používat Write-Host k zobrazení chybových zpráv v prostředí PowerShell Zkuste Catch

Stejně jako vlastnost CategoryInfo v poslední podsekci má automatická proměnná $error také vlastnost s názvem Výjimka . Chcete-li zobrazit výjimku v chybě, spusťte příkaz níže:

|_+_|

Bohužel, pokud se pokusíte zobrazit tyto informace pomocí příkazu Write-Host, nefunguje to podle očekávání.

|_+_|

Zde je výsledek tohoto příkazu v PowerShellu…

Jak používat Write-Host k zobrazení chybových zpráv v prostředí PowerShell Zkuste Catch

Jak vidíte, příkaz zobrazí spoustu dalších informací. Dobrá zpráva je, že $error.Exception má další vlastnost tzv Zpráva .

Tuto podvlastnost můžete volat tak, že ji připojíte k $error.Exception , takhle…

|_+_|

Kromě toho můžete použít Write-Host příkaz pro zobrazení této informace o chybě...

|_+_|

Poslední příkaz nyní zobrazuje skutečnou chybovou zprávu…

Kromě toho, že existuje konkrétní důvod k použití Write-Host jak je znázorněno v posledním příkazu, můžete jednoduše zobrazit stejnou chybovou zprávu pomocí $error.Exception příkaz.

Jak vytvořit hashtable v PowerShellu Zkuste Catch Block

Existují dva běžné způsoby, jak můžete vytvořit a Hashtable PowerShell v bloku Try Catch.

  1. V bloku Try můžete vytvořit hashovací tabulku s více páry klíč/hodnota
  2. Alternativně můžete vytvořit jednu hashovací tabulku klíč/hodnota pomocí Klíč mimo Zkuste Catc h bloku a Hodnota v Zkuste Catc h blok.

Zde je příklad prvního způsobu…

|_+_|

Jak můžete vidět, hasttable je uvnitř Zkuste Catc h blok…

Na druhou stranu můžete vytvořit jeden hashtable Key s hodnotou definovanou v a Zkuste Catc h blok. Zde je příklad…

|_+_|

Abych potvrdil, že poslední skript vytváří hashtable PowerShell, po spuštění skriptu jsem zavolal hodnoty uložené v proměnné $hashtable.

Jak můžete vidět z výsledku posledního příkazu, má dvojici Název/Hodnota!

PowerShell Vyzkoušejte příklady Catch

PowerShell Vyzkoušejte příklady Catch

V této poslední části se budu zabývat několika příklady použití PowerShell Try Catch.

Jak používat PowerShell Zkus chytit S Get-Childitem

Příkaz Get-Childitem může vrátit více chyb. Pro ilustraci dvou běžných chyb použiji dva níže uvedené příkazy:

|_+_|

Správná cesta k textovému souboru použitému v posledním příkazu je D:PS-Tutorialfilelist.txt.

Nicméně v prvním příkazu jsem zařadil mezeru za D:PS-Tutorial. To vedlo k chybě (brzy určíme podrobnosti o chybě).

Ve druhém příkazu jsem také zadal správnou cestu, ale použil jsem nesprávný název souboru. To vedlo k chybě.

|_+_| Jak používat PowerShell Vyzkoušejte Catch With Get-Childitem

Pokud chci o těchto chybách získat více informací, spustím příkazy v prostředí PowerShell Zkus chytit blok.

|_+_|

Naším prvním úkolem je určit typy chyb vrácených příkazy. Chcete-li získat tyto informace, spusťte níže uvedené příkazy…

|_+_|

Zde jsou výsledky příkazů…

Jak používat PowerShell Zkuste Catch exportovat chyby Get-WMIObject pomocí Export-csvChyby uložené v automatické proměnné $error jsou uloženy v poli PowerShell . Ke každému objektu v poli se přistupuje přidáním [0], [1] na konec pole. 0 představuje první položku v poli, zatímco 1 představuje druhou položku a tak dále.

Zpět k získání dalších informací o chybách vyvolaných Get-Childitem na základě typů chyb můžeme upravit náš blok Try Catch, aby zachytil tyto 2 typy chyb…

|_+_|

Naším druhým úkolem je zobrazovat skutečné chybové zprávy. Tento příkaz provede úlohu:

|_+_|

Příkaz zobrazí dvě chybové zprávy…

Jak používat PowerShell Zkus chytit Chcete-li exportovat chyby Get-WMIObject pomocí Export-csv

V této podsekci exportuji chyby generované při spuštění Get-WMIObject na vzdáleném počítači do souboru CSV s příponou Export-csv příkaz.

Nejprve se podívejme na podrobnosti o chybě generované při pokusu o připojení k offline vzdálenému počítači pomocí Get-WMIObject . Pro ilustraci spusťte níže uvedený příkaz...

|_+_|

Příkaz vygeneroval chybovou zprávu, protože Počítač není platný název počítače.

Jak zachytit chyby Get-Process s PowerShell Vyzkoušejte Catch Statement

Pokračujeme, abych chybu vyřešil, spustím příkaz v rámci Snaž se blok a Zkus chytit tvrzení.

|_+_|

V prvním řádku Snaž se bloku, definoval jsem proměnnou $ComputerName. Pak, ve druhém řádku, jsem spustil Get-WmiObject příkaz.

Kromě toho v Chytit bloku, vytvořil jsem podrobnosti o chybě a exportoval jsem je do souboru CSV s Export-csv .

Zde je podrobné vysvětlení skriptu v Snaž se blok:

  1. Na řádku 1 jsem vytvořil proměnnou $path, která určuje, kam chci uložit soubor CSV
  2. Poté jsem na řádku 2 použil příkaz Get-Date k vytvoření názvu souboru pro soubor CSV. Název souboru je ve formátu, yyyyMMdd_HHmmss.csv
  3. Na řádku 3 jsem vytvořil prázdný objekt uložený v proměnné $data
  4. Poté jsem na řádek 4 přidal sloupec ‚Název počítače‘ do objektu, který jsem vytvořil na řádku 3. Sloupec přebírá proměnnou $ComputerName
  5. Na řádek 5 jsem přidal svazek „Chybová zpráva“, který uloží chybové zprávy, $error.Exception.Message
  6. Poté jsem na řádku 6 vytvořil proměnnou $csvfilepath, která kombinuje proměnné $path a $csvfilename, aby vytvořila úplnou cestu k souboru CSV
  7. Nakonec jsem v řádku 7 převedl informace uložené v proměnné $data ($ComputerName a $error.Exception.Message) do Export-csv a uložil soubor do $csvfilepath
The NoTypeInformation Parametr v příkazu Export-csv odstraní informace o typu. Chcete-li zjistit více, přečtěte si naši příručku Powershell NoTypeInformation: Aplikace a příklady

Níže uvedený snímek obrazovky ukazuje CSV vytvořený skriptem…

Jak zachytit chyby Get-Process pomocí PowerShell Zkus chytit Tvrzení

Pokud spustíte příkaz Get-Process s ID procesu, které neexistuje, vrátí a Microsoft.PowerShell.Commands.ProcessCommandException chyba.

Chcete-li zachytit tento konkrétní typ výjimky, spusťte příkaz podobný tomu níže:

|_+_|

Zde je výsledek skriptu v PowerShell ISE.

Případně můžete definovat vlastní chybovou zprávu úpravou skriptu, jak je uvedeno níže…

|_+_|

Nyní skript vrátí vlastní chybovou zprávu…

Jak zachytit chyby Get-Mailbox pomocí PowerShell Zkus chytit Tvrzení

Pokud se připojíte k Office 365 PowerShell a spustíte Get-Mailbox proti uživateli, který neexistuje, zobrazí se chybová zpráva. Někteří uživatelé hlásili, že mají problémy se zachycením chybové zprávy Get-Mailbox příkaz.

Chcete-li tento scénář otestovat, po připojení k našemu Účet Office 365 přes PowerShell jsem spustil níže uvedený skript:

|_+_| Uživatel Pius v našem účtu Office 365 neexistuje.

Skript vrátil chybovou zprávu Operaci nelze provést, protože objekt „Pius“ nelze nalézt na stránce „AM6PR05A05DC002.EURPR05A005.PROD.OUTLOOK.COM '.

Zde je snímek obrazovky…

Pokud však Zkus chytit zachytí chybu, zkuste přidat typ výjimky, jak je znázorněno v upraveném příkazu níže:

|_+_|

To je vše – náš komplexní a aktualizovaný průvodce PowerShell Zkuste Catch Final ly! Doufám, že vám to pomohlo?

Pokud vám to pomohlo, hlasujte Ano na otázku Byl tento příspěvek užitečná níže.

Případně můžete položit otázku, zanechat komentář nebo poskytnout další zpětnou vazbu pomocí formuláře Zanechat odpověď, který najdete na konci této stránky.

A nakonec, pro další PowerShell tech S Zones, navštivte naši stránku průvodce Windows PowerShell How-To. Velmi užitečná vám může být také naše stránka Práce z domova.

Reference a další čtení

  1. O Try Catch Konečně
  2. O pasti
  3. PowerShell Array a Add to Array: Aplikace a příklady
  4. Vysvětlení Powershell pro smyčku: Syntaxe a příklady