Ako používať PowerShell Skúste Catch Final zvládnuť chyby

15. júla 2021 10258 Názory Ďalšie dôležité informácie o PowerShell Skúste

PowerShell Skús chytiť blok sa používa na spracovanie chýb v skriptovaní PowerShell. Pri používaní PowerShell Skús chytiť bloku pre skriptovanie môžete dosiahnuť nasledovné:





  1. Nechajte skript pokračovať v behu napriek chybe
  2. Zobrazujte a spracovávajte chybové hlásenia lepšie

V tejto príručke sa naučíte používať Powershell Skús chytiť bloky na spracovanie ukončovacích chybových hlásení v PowerShell. Okrem toho sa naučíte, ako zahrnúť Konečne blok v a Skús chytiť blokovať.



Sprievodca začína syntaxou súboru Skús chytiť blokovať.

Prehľadávať témy príspevkov



PowerShell Skús chytiť Syntax

PowerShell Vyskúšajte syntax Catch

Syntax prostredia PowerShell Skús chytiť je…



|_+_|

The Skúste je časť bloku, ktorú má PowerShell monitorovať kvôli chybám. Toto je blok s pôvodnými skriptami, ktorý môže vrátiť ukončovaciu chybu.

Keď sa vyskytne chyba v bloku Try, PowerShell uloží chybu do automatickej premennej $Error (viac o tom neskôr).



Na druhej strane, t on chytiť vyhlásenie prostredia PowerShell Skús chytiť blok spracováva chyby generované v bloku try. Môžete tiež určiť typy chýb, ktoré sú spracované v rámci Chytiť výpisový blok.



The Konečne blok možno použiť na uvoľnenie akýchkoľvek zdrojov, ktoré už skript nepotrebuje.

Bežné typy chýb výnimiek v prostredí PowerShell Skús chytiť

Typy chýb v PowerShell Skúste Catch

V bloku Try Catch PowerShell môžete spracovať rôzne typy chýb. Môžete napríklad riešiť konkrétne chyby.

Okrem toho môžete spracovať všeobecné chybové hlásenia. Na zvládnutie špecifických typov chýb však potrebujete poznať typ chyby.

ďalej v tejto príručke sa dozviete, že chybové hlásenia sa ukladajú do automatickej premennej $error. Okrem toho sa chyby môžu uložiť aj do premennej potrubia $_.

Okrem toho sa chyby uložené v automatickej premennej $error ukladajú do poľa. Aby sme to vysvetlili, spustite príkaz, ktorý vráti ukončovacie chybové hlásenie:

Ak chcete vymazať všetky chyby predtým uložené v $chyba automatickú premennú, pred spustením nižšie uvedeného príkazu najprv spustite $error.Clear() príkaz. |_+_| Neexistuje žiadny protokol udalostí s názvom Systerr, takže príkaz v bloku Try vyvolá chybové hlásenie.

Príkaz prekvapivo nezobrazil žiadne chybové hlásenie. Čo sa teda stalo s chybovým hlásením?

nastavenie raid 5 windows 10

Uloží sa do automatickej premennej $error! Ak chcete zobraziť chybu z posledného príkazu uloženého v premennej $error, spustite príkaz…

|_+_|

Výsledok príkazu zobrazí podrobnosti o chybe uložené v automatickej premennej $error. Informácie o chybe majú sekciu s názvom FullyQualifiedErrorId .

Pre túto konkrétnu chybu FullyQualifiedErrorId má dva súbory informácií – System.InvalidOperationException a Microsoft.PowerShell.Commands.GetEventLogCommand .

Informácie, ktoré nás zaujímajú, sú System.InvalidOperationException . Toto je typ chyby, ktorý môžete chytiť v bloku PowerShell Try Catch.

Ak chcete získať názov tejto výnimky prostredia PowerShell, spustite príkaz nižšie:

|_+_|

Je to tu, System.InvalidOperationException !

V nasledujúcich niekoľkých podsekciách budem diskutovať o bežných chybách PowerShell Try Catch Exception.

PowerShell Skúste Catch CommandNotFoundException Chyba

Ak spustíte príkaz, ktorý v PowerShell alebo príkazovom riadku Microsoft neexistuje, zobrazí sa chybové hlásenie. Napríklad, ak spustíte Get-File príkazu, dostanete chybové hlásenie, pretože tento príkaz nie je platným cmdlet prostredia PowerShell.

Tu je snímka obrazovky s výsledkom príkazu v PowerShell…

PowerShell Skúste Catch CommandNotFoundException Error

Ako môžete vidieť na snímke obrazovky, typ výnimky (FullyQualifiedErrorId ) je CommandNotFoundException .

Keďže ide o chybu ukončenia, váš skript nebude pokračovať. Ak chcete zabrániť tejto chybe ukončiť váš skript, zabaľte príkaz do a Skús chytiť blokovať.

Ak túto chybu zabalíme do bloku Try Catch v PowerShell, PowerShell chybu potlačí. Navyše to zastaví ukončenie vášho skriptu.

Aj keď je chyba potlačená, uloží sa do premennej $error. Ako obvykle, pred spustením nižšie uvedeného príkazu najskôr vymažte chyby uložené v premennej $error.

|_+_|

Ak chcete spustiť príkaz v PowerShell namiesto PowerShell ISE, zadajte príkazy do jedného riadku, ako je uvedené nižšie:

|_+_|

Potom na zobrazenie chyby spustite...

|_+_|

Ako som už spomenul v hlavnom úvode k tejto časti, ak chcete zobraziť ID výnimky pre túto chybu, spustite príkaz nižšie:

|_+_|

Celý názov výnimky je System.Management.Automation.CommandNotFoundException .

PowerShell Skúste Catch ManagementObjectNotFoundException Chyba

Keď spustíte príkaz vo vzdialenej relácii PS s nesprávnymi informáciami, PowerShell vráti a ManagementObjectNotFoundException chyba.

Typický scenár je, keď sa pripojíte k Office 365 pomocou PowerShell. Potom spustite príkaz Get-User, ale zadajte nesprávneho používateľa identity .

PowerShell Skúste Catch ManagementObjectNotFoundException Error

Ak chcete túto chybu zachytiť pomocou PowerShell Try Catch, použite príkaz podobný tomu nižšie:

|_+_| Chytanie ManagementObjectNotFoundException chyba s PowerShell Skúste, Catch je obzvlášť zložitý. Musíte použiť ErrorAction parameter a špecifikujte Stop . V opačnom prípade sa chyba zobrazí aj pri možnosti Skús, chytiť.

Nakoniec, ak chcete získať názov výnimky, použite príkaz nižšie:

|_+_|

Príkaz vráti typ výnimky ako System.Management.Automation.RemoteException . Takže, čo je ManagementObjectNotFoundException ?

ManagementObjectNotFoundException je dôvod výnimky potvrdený príkazom nižšie:

|_+_|

PowerShell Skúste Catch UnauthorizedAccessException Chyba

Ďalšou bežnou chybou výnimky PowerShell je UnauthorizedAccessException . Tento typ chyby sa vyvolá pri pokuse o prístup k položke, pre ktorú nemáte aspoň oprávnenie na čítanie.

Na ilustráciu tohto príkladu som zamietol overeným používateľom prístup ku konkrétnemu súboru v mojom počítači.

PowerShell Skúste Catch UnauthorizedAccessException Error

Ak sa teraz pokúsim získať prístup k súboru pomocou príkazu Get-Content, dostanem správu o odmietnutí prístupu.

|_+_|

Ak chcete zastaviť zobrazovanie tejto chyby, spustite príkaz v bloku PowerShell Try Catch, ako je uvedené nižšie…

|_+_|

Bohužiaľ, vyššie uvedený príkaz nezastaví zobrazovanie chyby. Dôvodom je, že nejde o ukončovaciu chybu.

Ak chcete zastaviť zobrazovanie chyby, zadajte ErrorAction parameter a špecifikujte Stop .

|_+_|

Teraz príkaz potlačí chybu. Ak chcete zobraziť typ výnimky, spustite príkaz nižšie...

|_+_|

Typ výnimky je System.UnauthorizedAccessException .

Existuje viac typov chýb výnimiek, než je popísané v tejto časti. Zaoberal som sa len najbežnejšími typmi výnimiek.

Ako zachytiť špecifické výnimky pomocou PowerShell Skúste Catch

Ako zachytiť špecifické výnimky pomocou PowerShell Skúste Catch

Posledná časť diskutovala o bežných výnimkách prostredia PowerShell a o tom, ako nájsť typ výnimky. Táto časť sa bude zaoberať tým, ako použiť tieto informácie na zachytenie špecifických typov chybových správ.

V sekcii syntaxe tejto príručky som povedal, že všeobecná syntax PowerShell Try Catch Nakoniec je…

|_+_|

V bloku catch syntaxe môžete vidieť [typ chyby]. Tu zadáte typ chyby, ktorú chcete v tomto bloku zachytiť.

Ak chcete napríklad zachytiť chyby UnauthorizedAccessException, použite nižšie uvedené vyhlásenia…

|_+_|

Ak chcete spustiť príkaz v prostredí PowerShell, zadajte príkazy v jednom riadku. Prvá časť príkazu – $error.Clear() – vymaže všetky chyby uložené v premennej $error.

|_+_|

Ako pridať viac Chytiť Bloky v prostredí PowerShell Skús chytiť Vyhlásenie

V úvode tejto časti som vám ukázal, ako zachytiť konkrétny typ výnimky v Chytiť blokovať. Môžete zadať viacero

Tu je príklad…

|_+_|

V tomto príklade prvý chytiť blok spracováva špecifikované typy výnimiek. Navyše, druhý chytiť block handles spracováva všeobecné chyby.

Ako extrahovať výnimku z chýb pomocou PowerShell Skúste Catch

Posledná podsekcia sa týkala toho, ako špecifikovať viacero blokov úlovkov na spracovanie rôznych typov výnimiek. V tejto podsekcii sa dozviete, ako extrahovať podrobnosti o chybe vo výnimke.

Na ilustráciu použijem príklad, ktorý som použil predtým. Spustite tento príkaz PowerShell v PowerShell.

|_+_|

Teraz spustite $error sám…

|_+_|

Hoci v premennej $error je uložených viacero informácií, skutočné chybové hlásenie je zvýraznené na snímke obrazovky nižšie.

Ako extrahovať podrobnosti o chybe pomocou PowerShell Skúste Catch

Ak chcete túto chybu zaprotokolovať do textového súboru, musíte zaznamenať iba podrobnosti o skutočnej chybe. Ak chcete odstrániť túto chybu, použite príkaz nižšie:

|_+_|

Príkaz extrahuje skutočné chybové hlásenie Prístup k ceste „D:PS-Tutorialfolder-names.txt“ je odmietnutý.

synchronizácia fotografií v iCloude nefunguje

Toto chybové hlásenie môžete zapísať do súboru denníka zahrnutím a Out-File príkaz v bloku Catch.

|_+_| Zahrnul som Pripojiť parameter v Out-File príkaz na umožnenie logovania viacerých záznamov bez prepisovania predchádzajúcich záznamov.

Aby bolo ľahké pochopiť posledný príkaz, prepíšem ho vo formáte skriptu nižšie…

|_+_|

Ako zahrnúť A Konečne Block To PowerShell Skús chytiť Vyhlásenie

Ako zahrnúť konečný blok do prostredia PowerShell Vyskúšajte príkaz Catch

Môžete zahrnúť a Konečne blokovať do PowerShell Skús chytiť Vyhlásenie. Syntax je

|_+_|

The konečne blok možno použiť na uvoľnenie akýchkoľvek zdrojov, ktoré už skript nepotrebuje.

Blok Nakoniec sa spustí, aj keď na zastavenie skriptu použijete CTRL+C. Blok sa spustí aj vtedy, ak kľúčové slovo Exit zastaví skript z bloku Catch.

V poslednom príklade som mal príkaz, ktorý zapisuje protokol chýb do textového súboru v Chytiť blokovať. Najlepšie miesto na získanie tohto vyhlásenia je však v a Konečne blokovať.

Pozrite si upravený skript nižšie...

|_+_|

Ďalšie užitočné informácie o PowerShell Skúste Catch

Ďalšie dôležité informácie o PowerShell Skúste

V tejto časti sa podelím o niekoľko jednoduchých, ale užitočných informácií o PowerShell Try Catch.

Ako vymazať PowerShell Skúste automatickú premennú Catch $Error

Automatická premenná $error má a jasný Metóda. Túto metódu môžete použiť na vymazanie všetkých chýb uložených v automatickej premennej $error.

Ak chcete vymazať všetky chyby uložené v automatickej premennej $error pre aktuálnu reláciu PowerShell, spustite príkaz nižšie.

|_+_|

Ako zobraziť vlastné chybové hlásenie v PowerShell Skúste Catch Block

Ak chcete zobraziť vlastné chybové hlásenie v PowerShell Try Catch Block, použite slovo Throw. Tu je príklad…

|_+_|

Tu je výsledok tohto skriptu v PowerShell ISE.

Ako zobraziť vlastné chybové hlásenie v PowerShell Skúste Catch Block

Ako získať informácie o chybovej kategórii v prostredí PowerShell Skúste Catch

Automatická premenná $error má vlastnosť s názvom CategoryInfo. Ak chcete zobraziť túto vlastnosť a ďalšie vlastnosti a metódy, spustite príkaz nižšie…

|_+_|

Zavolá sa jedna z vlastností vrátených posledným príkazom Informácie o kategórii .

Ak chcete získať prístup k týmto informáciám, spustite príkaz nižšie.

veľkosti priečinkov na jednotke google
|_+_|

Tento príkaz vráti viacero podvlastností.

Ako získať informácie o chybovej kategórii v prostredí PowerShell Skúste Catch

Ku každej z týchto podvlastností je možné pristupovať tak, že za bodku pridáte názov podvlastnosti. Ak chcete napríklad zobraziť podvlastnosti Reason, spustite príkaz nižšie.

|_+_|

Ako používať Write-Host na zobrazenie chybových správ v PowerShell Skúste Catch

Rovnako ako vlastnosť CategoryInfo v poslednej podsekcii, aj automatická premenná $error má vlastnosť tzv Výnimka . Ak chcete zobraziť výnimku v chybe, spustite príkaz nižšie:

|_+_|

Bohužiaľ, ak sa pokúsite zobraziť tieto informácie pomocou príkazu Write-Host, nefunguje to podľa očakávania.

|_+_|

Tu je výsledok tohto príkazu v PowerShell…

Ako používať Write-Host na zobrazenie chybových správ v PowerShell Skúste Catch

Ako vidíte, príkaz zobrazuje množstvo ďalších informácií. Dobrá správa je, že $error.Výnimka má inú nehnuteľnosť tzv Správa .

Túto podvlastnosť môžete zavolať tak, že ju pripojíte k $error.Výnimka , Páči sa ti to…

|_+_|

Okrem toho môžete použiť Write-Host príkaz na zobrazenie týchto informácií o chybe...

|_+_|

Posledný príkaz teraz zobrazuje skutočné chybové hlásenie...

Okrem toho, že existuje konkrétny dôvod na použitie Write-Host ako je uvedené v poslednom príkaze, môžete jednoducho zobraziť rovnaké chybové hlásenie s $error.Výnimka príkaz.

Ako vytvoriť hashtable v PowerShell Skúste Catch Block

Existujú dva bežné spôsoby, ako môžete vytvoriť a Hashtable PowerShell v bloku Try Catch.

  1. V bloku Try môžete vytvoriť hašovaciu tabuľku s viacerými pármi kľúč/hodnota
  2. Prípadne môžete vytvoriť jednu hashovaciu tabuľku kľúč/hodnota pomocou kľúč mimo Skúste Catc h bloku a Hodnota v rámci Skúste Catc h blok.

Tu je príklad prvej metódy...

|_+_|

Ako môžete vidieť, hasttable je v rámci Skúste Catc h blok…

Na druhej strane môžete vytvoriť jeden hashovací kľúč s hodnotou definovanou v a Skúste Catc h blok. Tu je príklad…

|_+_|

Aby som potvrdil, že posledný skript vytvára hashtable PowerShell, po spustení skriptu som zavolal hodnoty uložené v premennej $hashtable.

Ako môžete vidieť z výsledku posledného príkazu, má pár Názov/Hodnota!

PowerShell Vyskúšajte príklady Catch

PowerShell Vyskúšajte príklady Catch

V tejto poslednej časti sa budem venovať viacerým príkladom použitia PowerShell Try Catch.

Ako používať PowerShell Skús chytiť S Get-Childitem

Príkaz Get-Childitem môže vrátiť viacero chýb. Na ilustráciu dvoch bežných chýb použijem dva nižšie uvedené príkazy:

|_+_|

Správna cesta k textovému súboru použitému v poslednom príkaze je D:PS-Tutorialfilelist.txt.

V prvom príkaze som však zaradil medzeru za D:PS-Tutorial. To viedlo k chybe (podrobnosti o chybe určíme čoskoro).

V druhom príkaze som tiež uviedol správnu cestu, ale použil som nesprávny názov súboru. Výsledkom bola chyba.

|_+_| Ako používať PowerShell Skúste Catch With Get-Childitem

Ak chcete získať viac informácií o týchto chybách, spustím príkazy v prostredí PowerShell Skús chytiť blokovať.

|_+_|

Našou prvou úlohou je určiť typy chýb vrátených príkazmi. Ak chcete získať tieto informácie, spustite príkazy nižšie...

|_+_|

Tu sú výsledky príkazov...

Ako používať PowerShell Skúste Catch exportovať chyby Get-WMIObject pomocou Export-csvChyby uložené v automatickej premennej $error sú uložené v poli PowerShell . Ku každému objektu v poli sa pristupuje pridaním [0], [1] na koniec poľa. 0 predstavuje prvú položku v poli, zatiaľ čo 1 predstavuje druhú položku atď.

Späť na získanie ďalších informácií o chybách vyvolaných serverom Get-Childitem príkaz, na základe typov chýb môžeme upraviť náš blok Try Catch, aby zachytil tieto 2 typy chýb...

|_+_|

Našou druhou úlohou je zobraziť aktuálne chybové hlásenia. Tento príkaz vykoná úlohu:

|_+_|

Príkaz zobrazí dve chybové hlásenia...

Ako používať PowerShell Skús chytiť Ak chcete exportovať chyby Get-WMIObject pomocou funkcie Export-csv

V tejto podsekcii exportujem chyby vygenerované pri spustení Get-WMIObject na vzdialenom počítači do súboru CSV s príponou Export-csv príkaz.

Najprv sa pozrime na podrobnosti o chybe vygenerované pri pokuse o pripojenie k offline vzdialenému počítaču s Get-WMIObject . Aby ste to ilustrovali, spustite príkaz nižšie...

|_+_|

Príkaz vygeneroval chybové hlásenie, pretože Počítač nie je platný názov počítača.

Ako zachytiť chyby Get-Process pomocou PowerShell Skúste Catch Statement

Pokračujeme, aby som chybu vyriešil, spustím príkaz v rámci Skúste blok a Skús chytiť vyhlásenie.

|_+_|

V prvom riadku Skúste bloku, definoval som premennú $ComputerName. Potom, v druhom riadku, som spustil Get-WmiObject príkaz.

Okrem toho v Chytiť bloku, vytvoril som podrobnosti o chybe a exportoval som ich do súboru CSV s Export-csv .

telefón je pripojený k wifi, ale bez internetu

Tu je podrobné vysvetlenie skriptu v Skúste blokovať:

  1. V riadku 1 som vytvoril premennú $path, ktorá určuje, kam chcem uložiť súbor CSV
  2. Potom som v riadku 2 použil príkaz Get-Date na vytvorenie názvu súboru pre súbor CSV. Názov súboru je vo formáte, yyyyMMdd_HHmmss.csv
  3. V riadku 3 som vytvoril prázdny objekt uložený v premennej s názvom $data
  4. Potom som v riadku 4 pridal stĺpec „Názov počítača“ do objektu, ktorý som vytvoril v riadku 3. Stĺpec má premennú $ComputerName
  5. V riadku 5 som pridal zväzok „Chybové hlásenie“, ktorý uloží chybové hlásenia, $error.Exception.Message
  6. Potom som v riadku 6 vytvoril premennú $csvfilepath, ktorá kombinuje premenné $path a $csvfilename na vytvorenie úplnej cesty k súboru CSV
  7. Nakoniec som v riadku 7 preniesol informácie uložené v premennej $data ($ComputerName a $error.Exception.Message) do Export-csv a uložil súbor do $csvfilepath
The NoTypeInformation Parameter v príkaze Export-csv odstráni informácie o type. Ak chcete zistiť viac, prečítajte si našu príručku Powershell NoTypeInformation: Aplikácie a príklady

Snímka obrazovky nižšie zobrazuje CSV vytvorený skriptom…

Ako zachytiť chyby Get-Process pomocou PowerShell Skús chytiť Vyhlásenie

Ak spustíte príkaz Get-Process s ID procesu, ktorý neexistuje, vráti a Microsoft.PowerShell.Commands.ProcessCommandException chyba.

Ak chcete zachytiť tento špecifický typ výnimky, spustite príkaz podobný tomu nižšie:

|_+_|

Tu je výsledok skriptu v PowerShell ISE.

Prípadne môžete definovať vlastnú chybovú správu úpravou skriptu, ako je uvedené nižšie...

|_+_|

Teraz skript vráti vlastnú chybovú správu…

Ako zachytiť chyby v e-mailovej schránke pomocou PowerShell Skús chytiť Vyhlásenie

Ak sa pripojíte k Office 365 PowerShell a spustíte Get-Mailbox proti používateľovi, ktorý neexistuje, dostanete chybové hlásenie. Niektorí používatelia hlásili problémy so zachytením chybového hlásenia Get-Mailbox príkaz.

Ak chcete otestovať tento scenár, po pripojení k nášmu Účet Office 365 cez PowerShell som spustil nižšie uvedený skript:

|_+_| Používateľ Pius v našom účte Office 365 neexistuje.

Skript vrátil chybové hlásenie Operáciu nebolo možné vykonať, pretože objekt „Pius“ sa nenašiel na stránke „AM6PR05A05DC002.EURPR05A005.PROD.OUTLOOK.COM '.

Tu je snímka obrazovky…

Ak však Skús chytiť zachytil chybu, skúste pridať typ výnimky, ako je znázornené v upravenom príkaze nižšie:

|_+_|

To je všetko – náš komplexný a aktualizovaný sprievodca PowerShell Skúste Catch Final ly! Dúfam, že vám to pomohlo?

Ak vám to pomohlo, zahlasujte Áno na otázku Bol tento príspevok užitočná nižšie.

Prípadne môžete položiť otázku, zanechať komentár alebo poskytnúť ďalšiu spätnú väzbu pomocou formulára Zanechať odpoveď, ktorý nájdete na konci tejto stránky.

Nakoniec, ak chcete získať viac zón PowerShell tech S, navštívte našu stránku sprievodcu Windows PowerShell ako na to. Veľmi užitočná vám môže byť aj naša stránka Práca z domovskej stránky.

Referencie a ďalšie čítanie

  1. O hre Skúste chytiť konečne
  2. O pasci
  3. PowerShell Array a Add to Array: Aplikácie a príklady
  4. Powershell For Loop Explained: Syntax a príklady