Cum să utilizați PowerShell Try Catch Finally pentru a gestiona erorile

15 iulie 2021 10258 Vizualizări Alte informații importante despre PowerShell Try

Un PowerShell Încearcă să prinzi bloc este utilizat pentru a gestiona erorile în scripturile PowerShell. Când utilizați PowerShell Încearcă să prinzi bloc pentru scripting puteți realiza următoarele:





  1. Faceți ca scriptul să continue să ruleze în ciuda unei erori
  2. Afișează și gestionează mai bine mesajele de eroare

În acest ghid, veți învăța cum să utilizați Powershell Încearcă să prinzi blocuri pentru a gestiona mesajele de eroare de terminare în PowerShell. În plus, veți învăța cum să includeți In cele din urma bloc în a Încearcă să prinzi bloc.



Ghidul începe cu sintaxa lui Încearcă să prinzi bloc.

Răsfoiți subiectele postărilor



PowerShell Încearcă să prinzi Sintaxă

Sintaxa PowerShell Try Catch

Sintaxa PowerShell Încearcă să prinzi este…



|_+_|

The Încerca este partea din bloc pe care doriți să o monitorizeze PowerShell pentru erori. Acesta este blocul cu scripturile originale care poate returna o eroare de terminare.

Când apare o eroare în blocul Try, PowerShell salvează eroarea în variabila automată $Error (mai multe despre aceasta mai târziu).



Pe de altă parte, t el captură declarația PowerShell Încearcă să prinzi block gestionează erorile generate în blocul try. De asemenea, puteți specifica tipurile de erori care sunt tratate în cadrul Captură bloc de declarații.



The In cele din urma block poate fi folosit pentru a elibera orice resurse care nu mai sunt necesare scriptului.

Tipuri comune de erori de excepție în PowerShell Încearcă să prinzi

Tipuri de erori în PowerShell Try Catch

Puteți gestiona diferite tipuri de erori într-un bloc PowerShell Try Catch. De exemplu, puteți gestiona anumite erori.

În plus, puteți gestiona mesajele de eroare generice. Cu toate acestea, pentru a gestiona anumite tipuri de erori, trebuie să cunoașteți tipul de eroare.

mai târziu în acest ghid, veți afla că mesajele de eroare sunt salvate în variabila automată $error. În plus, erorile pot fi salvate și în variabila $_ pipeline.

Mai mult, erorile salvate în variabila automată $error sunt salvate într-o matrice. Pentru a explica acest lucru, să rulăm o comandă care returnează un mesaj de eroare de încheiere:

Pentru a șterge toate erorile salvate anterior în $eroare variabilă automată, înainte de a rula comanda de mai jos, mai întâi, rulați $error.Clear() comanda. |_+_| Nu există niciun jurnal de evenimente numit Systerr, așa că comanda din blocul Try va arunca un mesaj de eroare.

În mod surprinzător, comanda nu a afișat niciun mesaj de eroare. Deci, ce s-a întâmplat cu mesajul de eroare?

Este salvat în variabila automată $error! Pentru a afișa eroarea de la ultima comandă, salvată în variabila $error, rulați comanda...

|_+_|

Rezultatul comenzii afișează detaliile erorii salvate în variabila automată $error. Informațiile despre eroare au o secțiune numită FullyQualifiedErrorId .

Pentru această eroare specifică, FullyQualifiedErrorId are două seturi de informații - System.InvalidOperationException și Microsoft.PowerShell.Commands.GetEventLogCommand .

Informațiile care ne interesează sunt System.InvalidOperationException . Acesta este un tip de eroare pe care o puteți captură în blocul PowerShell Try Catch.

Pentru a obține numele acestei excepții PowerShell, executați comanda de mai jos:

|_+_|

Iata, System.InvalidOperationException !

În următoarele câteva sub-secțiuni, voi discuta despre erorile comune PowerShell Try Catch Exception.

PowerShell Try Catch CommandNotFoundException Eroare

Dacă executați o comandă care nu există în PowerShell sau Microsoft Command Prompt, veți primi un mesaj de eroare. De exemplu, dacă rulați Ia fisierul comandă, veți primi un mesaj de eroare deoarece această comandă nu este un cmdlet PowerShell valid.

Iată o captură de ecran a rezultatului comenzii din PowerShell...

Eroare PowerShell Try Catch CommandNotFoundException

După cum puteți vedea din captură de ecran, tipul de excepție (FullyQualifiedErrorId) este CommandNotFoundException .

Deoarece aceasta este o eroare de terminare, va opri continuarea scriptului. Pentru a opri această eroare de la terminarea scriptului, împachetați comanda în a Încearcă să prinzi bloc.

Dacă includem această eroare într-un bloc PowerShell Try Catch, PowerShell va suprima eroarea. Mai mult, va opri terminarea scriptului.

Cu toate acestea, chiar dacă eroarea este suprimată, aceasta este salvată în variabila $error. Ca de obicei, înainte de a rula comanda de mai jos, ștergeți mai întâi erorile salvate în variabila $error.

|_+_|

Dacă doriți să rulați comanda în PowerShell în loc de PowerShell ISE, introduceți comenzile într-o singură linie, așa cum se arată mai jos:

|_+_|

Apoi, pentru a afișa eroarea, rulați...

|_+_|

După cum am menționat în introducerea principală a acestei secțiuni, pentru a afișa ID-ul excepției pentru această eroare, executați comanda de mai jos:

|_+_|

Numele complet al excepției este System.Management.Automation.CommandNotFoundException .

PowerShell Try Catch ManagementObjectNotFoundException Eroare

Când executați o comandă într-o sesiune PS la distanță cu informații greșite, PowerShell returnează a ManagementObjectNotFoundException eroare.

Un scenariu tipic este atunci când vă conectați la Office 365 cu PowerShell. Apoi, rulați comanda Get-User, dar furnizați utilizatorul greșit identitate .

Eroare PowerShell Try Catch ManagementObjectNotFoundException

Pentru a detecta această eroare cu PowerShell Try Catch, utilizați o comandă similară cu cea de mai jos:

|_+_| Prinderea ManagementObjectNotFoundException eroare cu PowerShell Try, Catch este deosebit de complicată. Trebuie să utilizați ErrorAction parametrul și specificați Stop . În caz contrar, chiar și cu Try, Catch, eroarea va fi în continuare afișată.

În cele din urmă, pentru a obține numele excepției, utilizați comanda de mai jos:

|_+_|

Comanda returnează tipul de excepție ca Sistem.Management.Automation.RemoteException . Deci, ce este ManagementObjectNotFoundException ?

ManagementObjectNotFoundException este motivul excepției, așa cum este confirmat de comanda de mai jos:

|_+_|

PowerShell Try Catch UnauthorizedAccessException Eroare

O altă eroare obișnuită de excepție PowerShell este UnauthorizedAccessException . Acest tip de eroare este aruncat atunci când încercați să accesați un articol pe care nu aveți cel puțin permisiunea de citire.

Pentru a ilustra acest exemplu, am interzis utilizatorilor autentificați accesul la un anumit fișier de pe computerul meu.

Eroare PowerShell Try Catch UnauthorizedAccessException

Acum, dacă încerc să accesez fișierul cu comanda Get-Content, primesc un mesaj de acces refuzat.

|_+_|

Pentru a opri afișarea acestei erori, executați comanda în blocul PowerShell Try Catch, așa cum se arată mai jos...

|_+_|

Din păcate, comanda de mai sus nu oprește afișarea erorii. Motivul este că nu este o eroare de terminare.

gapps pentru cm 13

Pentru a opri afișarea erorii, includeți ErrorAction parametrul și specificați Stop .

|_+_|

Acum, comanda suprimă eroarea. Pentru a afișa tipul de excepție, rulați comanda de mai jos...

|_+_|

Tipul de excepție este System.UnauthorizedAccessException .

Există mai multe tipuri de erori de excepție decât ceea ce este tratat în această secțiune. Am acoperit doar cele mai comune tipuri de excepții.

Cum să captați excepții specifice cu PowerShell Încercați Catch

Cum să captați excepții specifice cu PowerShell Încercați Catch

Ultima secțiune a discutat despre excepțiile comune PowerShell și cum să găsiți tipul de excepție. Această secțiune va acoperi modul de utilizare a acestor informații pentru a captura anumite tipuri de mesaje de eroare.

În secțiunea de sintaxă a acestui ghid, am spus că sintaxa generală a unui PowerShell Try Catch Finally este...

|_+_|

În blocul catch al sintaxei, puteți vedea [tipul de eroare]. Aici specificați tipul de eroare pe care doriți să o detectați în acest bloc.

De exemplu, pentru a detecta erorile UnauthorizedAccessException, utilizați instrucțiunile de mai jos...

|_+_|

Pentru a rula comanda în PowerShell, specificați instrucțiunile într-o singură linie. Prima parte a instrucțiunii – $error.Clear() – șterge orice erori salvate în variabila $error.

|_+_|

Cum se adaugă mai multe Captură Blocuri într-un PowerShell Încearcă să prinzi Afirmație

În introducerea acestei secțiuni, v-am arătat cum să prindeți un anumit tip de excepție în Captură bloc. Puteți specifica mai multe

Iată un exemplu…

|_+_|

În acest exemplu, primul captură block gestionează tipurile specificate de excepții. Mai mult, al doilea captură mânerele de bloc tratează erorile generice.

Cum să extrageți excepția de eroare cu PowerShell Try Catch

Ultima subsecțiune a acoperit cum să specificați mai multe blocuri de captură pentru a gestiona diferite tipuri de excepții. În această subsecțiune, veți învăța cum să extrageți detaliile erorii într-o excepție.

Pentru a ilustra acest lucru, voi folosi un exemplu pe care l-am folosit mai devreme. Rulați această instrucțiune PowerShell în PowerShell.

|_+_|

Acum rulați singur eroarea $...

|_+_|

Deși mai multe informații sunt salvate în variabila $error, mesajul de eroare real este evidențiat în captura de ecran de mai jos.

Cum să extrageți detalii despre eroare cu PowerShell Try Catch

Dacă doriți să înregistrați această eroare într-un fișier text, trebuie să înregistrați doar detaliile reale ale erorii. Pentru a extrage această eroare, utilizați comanda de mai jos:

|_+_|

Comanda extrage mesajul de eroare real Accesul la calea „D:PS-Tutorialfolder-names.txt” este interzis.

Puteți scrie acest mesaj de eroare într-un fișier jurnal incluzând un Out-File comanda în blocul Catch.

|_+_| Am inclus Adăuga parametrul în Out-File comandă pentru a permite înregistrarea mai multor intrări fără a suprascrie intrările anterioare.

Pentru a fi ușor de înțeles ultima comandă, o voi rescrie în formatul de script de mai jos...

|_+_|

Cum să includeți A In cele din urma Blocați către PowerShell Încearcă să prinzi Afirmație

Cum să includeți un bloc final în declarația Try Catch PowerShell

Puteți include o In cele din urma blocați către PowerShell Încearcă să prinzi Afirmație. Sintaxa este

|_+_|

The in cele din urma block poate fi folosit pentru a elibera orice resurse care nu mai sunt necesare scriptului.

Un bloc Finally rulează chiar dacă utilizați CTRL+C pentru a opri scriptul. Blocul va rula și dacă un cuvânt cheie Exit oprește scriptul dintr-un bloc Catch.

În ultimul exemplu, am avut instrucțiunea care scrie jurnalul de erori într-un fișier text din fișierul Captură bloc. Cu toate acestea, cel mai bun loc pentru a avea această declarație este în a In cele din urma bloc.

Vezi mai jos scriptul modificat...

|_+_|

Informații utile suplimentare despre PowerShell Try Catch

Alte informații importante despre PowerShell Try

În această secțiune, voi împărtăși câteva informații simple, dar utile despre PowerShell Try Catch.

Cum să ștergeți PowerShell Try Catch $Error Automatic Variable

Variabila automată $error are a clar Metodă. Puteți folosi această metodă pentru a șterge toate erorile salvate în variabila automată $error.

Pentru a șterge toate erorile salvate în variabila automată $error pentru sesiunea curentă PowerShell, executați comanda de mai jos.

|_+_|

Cum să afișați un mesaj de eroare personalizat în PowerShell Încercați blocarea capturii

Pentru a afișa un mesaj de eroare personalizat într-un bloc PowerShell Try Catch, utilizați cuvântul Aruncă. Iată un exemplu…

|_+_|

Iată rezultatul acestui script în PowerShell ISE.

Cum să afișați un mesaj de eroare personalizat în PowerShell Încercați blocarea capturii

Cum să obțineți informații despre categoria despre eroare în PowerShell Try Catch

Variabila automată $error are o proprietate numită CategoryInfo. Pentru a vedea această proprietate și alte proprietăți și metode, rulați comanda de mai jos...

|_+_|

Una dintre proprietățile returnate de ultima comandă este apelată CategoryInfo .

Pentru a accesa aceste informații, executați comanda de mai jos.

|_+_|

Această comandă returnează mai multe sub-proprietăți.

Cum să obțineți informații despre categoria despre eroare în PowerShell Try Catch

Fiecare dintre aceste sub-proprietăți poate fi accesată adăugând numele sub-proprietăților după un punct. De exemplu, pentru a afișa sub-proprietățile Reason, rulați comanda de mai jos.

|_+_|

Cum să utilizați Write-Host pentru a afișa mesaje de eroare în PowerShell Try Catch

Ca și proprietatea CategoryInfo din ultima sub-secțiune, variabila automată $error are și o proprietate numită Excepție . Pentru a afișa excepția într-o eroare, executați comanda de mai jos:

|_+_|

Din păcate, dacă încercați să afișați aceste informații cu comanda Write-Host, nu funcționează conform așteptărilor.

|_+_|

Iată rezultatul acestei comenzi în PowerShell...

Cum să utilizați Write-Host pentru a afișa mesaje de eroare în PowerShell Try Catch

După cum puteți vedea, comanda afișează o mulțime de alte informații. Vestea bună este că $error.Excepție are o altă proprietate numită Mesaj .

Puteți apela această sub-proprietate anexând-o la $error.Excepție , ca aceasta…

|_+_|

În plus, puteți utiliza Scriere-gazdă comandă pentru a afișa această informație de eroare...

|_+_|

Ultima comandă afișează acum mesajul de eroare real...

Cu excepția faptului că există un motiv specific de utilizare Scriere-gazdă după cum se arată în ultima comandă, puteți pur și simplu afișa același mesaj de eroare cu $error.Excepție comanda.

Cum se creează un hashtable într-un bloc PowerShell Try Catch

Există două moduri comune în care puteți crea un Tabel hashtable PowerShell într-un bloc Try Catch.

  1. Puteți crea un hashtable cu mai multe perechi cheie/valoare în blocul Try
  2. Alternativ, puteți crea un singur hashtable cheie/valoare cu Cheie in afara Încercați Catc h bloc și Valoarea din Încercați Catc h bloc.

Iată un exemplu al primei metode...

|_+_|

După cum puteți vedea, hasttable este în Încercați Catc h bloc...

Pe de altă parte, puteți crea o singură cheie hashtable cu Valoarea definită în a Încercați Catc h bloc. Iată un exemplu…

|_+_|

Pentru a confirma că ultimul script produce un hashtable PowerShell, după rularea scriptului, am apelat valorile salvate în variabila $hashtable.

După cum puteți vedea din rezultatul ultimei comenzi, are o pereche Nume/Valoare!

Exemple PowerShell Try Catch

Exemple PowerShell Try Catch

În această secțiune finală, voi acoperi mai multe exemple de aplicare a PowerShell Try Catch.

nu pot încărca imaginea de profil Steam

Cum să utilizați PowerShell Încearcă să prinzi Cu Get-Childitem

Comanda Get-Childitem poate returna mai multe erori. Pentru a ilustra cele două erori comune, voi folosi cele două comenzi de mai jos:

|_+_|

Calea corectă către fișierul text folosit în ultima comandă este D:PS-Tutorialfilelist.txt.

Totuși, în prima comandă am inclus un spațiu după D:PS-Tutorial. Acest lucru a dus la o eroare (vom determina detaliile erorii în curând).

De asemenea, în a doua comandă, am specificat calea corectă, dar am folosit numele de fișier greșit. Acest lucru a dus la o eroare.

|_+_| Cum să utilizați PowerShell Try Catch cu Get-Childitem

Mergând mai departe, pentru a obține mai multe informații despre aceste erori, voi rula comenzile într-un PowerShell Încearcă să prinzi bloc.

|_+_|

Prima noastră sarcină este să determinăm tipurile de erori returnate de comenzi. Pentru a obține aceste informații, rulați comenzile de mai jos...

|_+_|

Iată rezultatele comenzilor...

Cum să utilizați PowerShell Try Catch pentru a exporta erorile Get-WMIObject cu Export-csvErorile salvate în variabila automată $error sunt stocate într-o matrice PowerShell . Fiecare obiect din matrice este accesat prin adăugarea unui [0], [1] la sfârșitul matricei. 0 reprezintă primul element din matrice, în timp ce 1 reprezintă al doilea element și așa mai departe.

Înapoi la obținerea de mai multe informații despre erorile aruncate de Get-Childitem comanda, pe baza tipurilor de erori, putem modifica blocul Try Catch pentru a captura aceste 2 tipuri de erori...

|_+_|

A doua noastră sarcină este să afișam mesajele de eroare reale. Această comandă va face treaba:

|_+_|

Comanda afișează cele două mesaje de eroare...

Cum să utilizați PowerShell Încearcă să prinzi Pentru a exporta erorile Get-WMIObject cu Export-csv

În această subsecțiune, voi exporta erorile generate atunci când rulez Get-WMIObject pe un computer la distanță într-un fișier CSV cu Export-csv comanda.

Mai întâi, să vedem detaliile erorii generate atunci când încercați să vă conectați la un computer de la distanță offline cu Get-WMIObject . Pentru a ilustra acest lucru, rulați comanda de mai jos...

|_+_|

Comanda a generat un mesaj de eroare deoarece Calculator nu este un nume valid pentru computer.

Cum să prindeți erorile de procesare Get-Process cu PowerShell Try Catch Statement

Mergând mai departe, pentru a gestiona eroarea, voi rula comanda în interiorul Încerca bloc de a Încearcă să prinzi afirmație.

|_+_|

În prima linie a Încerca bloc, am definit variabila $ComputerName. Apoi, în a doua linie, am alergat pe Get-WmiObject comanda.

În plus, în Captură bloc, am creat detaliile erorii exportate într-un fișier CSV cu Export-csv .

Iată o explicație detaliată a scenariului în Încerca bloc:

  1. În linia 1, am creat o variabilă $path care specifică unde vreau să salvez fișierul CSV
  2. Apoi, în linia 2 am folosit comanda Get-Date pentru a crea un nume de fișier pentru fișierul CSV. Numele fișierului este în formatul, aaaaMMdd_HHmmss.csv
  3. În linia 3, am creat un obiect gol salvat într-o variabilă numită $data
  4. Apoi, în linia 4 am adăugat coloana „Nume computer” în obiectul creat în linia 3. Coloana ia variabila $ComputerName
  5. În rândul 5, am adăugat volumul „Mesaj de eroare” care va salva mesajele de eroare, $error.Exception.Message
  6. Apoi, în linia 6, am creat o variabilă $csvfilepath care combină variabilele $path și $csvfilename pentru a crea o cale completă către fișierul CSV
  7. În cele din urmă, în rândul 7, am introdus informațiile salvate în variabila $data ($ComputerName și $error.Exception.Message) în Export-csv și a salvat fișierul în $csvfilepath
The NoTypeInformation parametrul din comanda Export-csv elimină informațiile de tip. Pentru a afla mai multe, citiți ghidul nostru, Powershell NoTypeInformation: Aplicații și exemple

Captura de ecran de mai jos arată CSV-ul creat de script-ul...

Cum să detectați erorile de obținere a procesului cu PowerShell Încearcă să prinzi Afirmație

Dacă rulați comanda Get-Process cu un ID de proces care nu există, va returna a Microsoft.PowerShell.Commands.ProcessCommandException eroare.

Pentru a captura acest tip specific de excepție, rulați o comandă similară celei de mai jos:

|_+_|

Iată rezultatul scriptului din PowerShell ISE.

Alternativ, puteți defini un mesaj de eroare personalizat modificând scriptul așa cum se arată mai jos...

|_+_|

Acum scriptul returnează mesajul de eroare personalizat...

Cum să detectați erorile de obținere a căsuței poștale cu PowerShell Încearcă să prinzi Afirmație

Dacă vă conectați la Office 365 PowerShell și rulați Get-Mailbox împotriva unui utilizator care nu există, veți primi un mesaj de eroare. Unii utilizatori au raportat că au probleme la capturarea mesajului de eroare în Get-Mailbox comanda.

Pentru a testa acest scenariu, după conectarea la nostru Cont Office 365 prin PowerShell, am rulat scriptul de mai jos:

|_+_| Utilizatorul, Pius, nu există în contul nostru Office 365.

Scriptul a returnat mesajul de eroare Operația nu a putut fi efectuată deoarece obiectul „Pius” nu a putut fi găsit pe „AM6PR05A05DC002.EURPR05A005.PROD.OUTLOOK.COM '.

Iată captura de ecran...

Cu toate acestea, dacă Încearcă să prinzi nu detectează eroarea, încercați să adăugați tipul de excepție așa cum se arată în comanda modificată de mai jos:

|_+_|

Asta este - ghidul nostru cuprinzător și actualizat despre PowerShell Încercați Catch Final te iubesc! Sper că ați găsit de ajutor?

Dacă vi s-a părut util, vă rugăm să votați da la întrebarea A fost utilă această postare de mai jos.

Alternativ, puteți pune o întrebare, lăsa un comentariu sau oferi mai multe feedback cu ajutorul formularului Lăsați un răspuns aflat la sfârșitul acestei pagini.

În cele din urmă, pentru mai multe zone PowerShell tech S, vizitați pagina noastră de ghid pentru Windows PowerShell. De asemenea, s-ar putea să găsească foarte utilă pagina noastră de lucru de acasă.

Referințe și lecturi suplimentare

  1. Despre Try Catch Finally
  2. Despre Trap
  3. PowerShell Array și Adăugați la Array: aplicații și exemple
  4. Powershell For Loop explicat: Sintaxă și exemple