Adam Automator (Română)

ați rulat vreodată un script sau un cmdlet PowerShell și vă confruntați cu un perete țipător de text – în roșu – ca cel prezentat mai jos?

Exemplu de erori în PowerShell

Erori pot deveni copleșitoare și confuz. Și, mai presus de toate, erorile sunt adesea greu de citit, ceea ce face imposibilă determinarea a ceea ce și unde scenariul a mers prost.,din fericire, aveți câteva opțiuni în PowerShell pentru a îmbunătăți acest lucru prin tratarea erorilor. Folosind manipularea erorilor, erorile pot fi filtrate și afișate astfel încât să fie mai ușor de înțeles. Și, înțelegerea erorii face ușor să adăugați mai multă logică la manipularea erorilor.în acest articol, veți afla despre erorile din PowerShell și cum pot fi interceptate pentru a efectua manipularea erorilor folosind blocurile PowerShell Try Catch (și finally).,

cuprins

înțelegerea modului în care funcționează erorile în PowerShell

înainte de a vă scufunda în tratarea erorilor, să acoperim mai întâi câteva concepte în jurul erorilor din PowerShell. Înțelegerea erorilor poate duce la strategii mai bune de gestionare a erorilor.

variabila automată $Error

în PowerShell, există o mulțime de variabile automate, iar una dintre ele este variabila automată $Error. PowerShell utilizează variabila $Error pentru a stoca toate erorile întâlnite în sesiune., Variabila $Error este o serie de erori sortate după cele mai recente.

când deschideți pentru prima dată o sesiune PowerShell, variabila $Error este goală. Puteți verifica acest lucru apelând variabila $Error.

$De Eroare variabilă este gol

după Cum puteți vedea, $Error variabila incepe gol., Dar, odată ce o eroare este generată, eroarea va fi adăugată și stocată în variabila $Error.

în exemplul de mai jos, eroarea este generată prin obținerea deliberată a unui nume de serviciu care nu există.

PS> Get-Service xyzPS> $ErrorPS> $Error.Count
eroarea este adăugat la $Eroare variabila

după Cum puteți vedea de ieșire de mai sus, generat de eroare a fost adăugat la $Error variabilă.,

variabila $Error conține o colecție de erori generate în sesiunea PowerShell. Fiecare eroare poate fi Acces prin apelarea poziției sale matrice. Cea mai recentă eroare va fi întotdeauna la indexul 0.

de exemplu, cea mai recentă eroare poate fi recuperată folosind $Error.

$De Eroare Object Properties

din moment ce totul în PowerShell este un obiect, $Error variabilă este un obiect, iar obiectele au proprietăți., Prin conducte $Error variabila de la Get-Member cmdlet-ul, ar trebui să vedeți lista de proprietăți disponibile.

$Error | Get-Member
$De Eroare object properties

Pentru a determina motivul pentru eroare, puteți vizualiza conținutul InvocationInfo proprietatea, folosind comanda de mai jos.,

$Error.InvocationInfo
La InvocationInfo proprietate

Acum, ați putea face același lucru cu alte proprietăți și de a descoperi ce alte informații puteți găsi!

erori de terminare

erori de terminare a opri fluxul de execuție atunci când este întâlnită de PowerShell vs erori non-terminare. Există mai multe moduri în care poate apărea o eroare de terminare. Un exemplu este atunci când apelați un cmdlet cu un parametru care nu există.,

după cum veți vedea din imaginea de mai jos, Când comanda Get-Process notepad rulează, comanda este validă și sunt afișate detaliile procesului notepad.

notepad procesul detalii

Dar, atunci când un parametru care nu există, care este folosit ca Get-Process notepad -handle 251, cmdlet-ul afișează o eroare care handle parametru nu este valabil. Apoi, cmdletul iese fără a afișa detaliile procesului notepad.,

Eroare este aruncat pentru că parametrul este invalid

Non-Încheiere Erori

Non-încheiere erori sunt erori care nu se opresc executarea de script-ul sau de comandă. De exemplu, consultați codul de mai jos. Acest cod primește lista de nume de fișiere din lista de fișiere.fișier txt. Apoi, scriptul trece prin fiecare nume de fișier, citiți conținutul fiecărui fișier și îl afișează pe ecran.

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

conținutul filelist.,fișier txt sunt numele de fișiere arată în lista de mai jos.

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

dar ce se întâmplă dacă File_6.log nu exista de fapt? Când executați codul, v-ați aștepta o eroare se va întâmpla, deoarece script-ul nu poate găsi File_6.jurnal. Veți vedea o ieșire similară prezentată mai jos.

Exemplu de non-încheiere de eroare

după Cum puteți vedea din captura de ecran de rezultatul de mai sus, scenariul a fost capabil să citească primele cinci fișiere în listă, dar atunci când este încercat pentru a citi fișierul File_6.,txt, o eroare este returnată. Scriptul a continuat apoi să citească restul fișierelor înainte de a ieși. Nu s-a terminat.

variabila $ ErrorActionPreference

până acum, ați aflat despre erorile de terminare și non-terminare și despre modul în care acestea diferă unele de altele. Dar, știați că o eroare care nu se termină poate fi forțată să fie tratată ca o eroare care se termină?PowerShell are un concept numit variabile de preferință. Aceste variabile sunt folosite pentru a schimba modul în care PowerShell se comportă în multe moduri diferite. Una dintre aceste variabile se numește $ErrorActionPreference.,

variabila$ErrorActionPreference este utilizată pentru a schimba modul în care PowerShell tratează Erorile care nu se termină. În mod implicit, valoarea $ErrorActionPreferenceeste setată la Continue. Modificarea valorii variabilei $ErrorActionPreference la STOPforțează PowerShell să trateze toate erorile ca erori de terminare.

utilizați codul de mai jos pentru a schimba valoarea $ErrorActionPreference.,

$ErrorActionPreference = "STOP"

Pentru a afla mai multe despre alte valabil $ErrorActionPreference valori variabile, vizita PowerShell ErrorActionPreference.

acum, consultați exemplul utilizat în secțiunea erori nefinalizate din acest articol. Script-ul poate fi modificat pentru a include schimbarea în $ErrorActionPreference cum ar fi codul prezentat mai jos:

de Funcționare a modificat codul de mai sus va comporta diferit decât înainte, atunci când $ErrorActionPreference valoarea este setată la valoarea implicită Continue.,

Forțând-o încheiere de eroare folosind $ErrorActionPreference variabila

după Cum puteți vedea din captura de ecran de rezultatul de mai sus, scenariul a fost capabil să citească primele cinci fișiere în listă, dar atunci când este încercat pentru a citi fișierul File_6.txt, o eroare este returnată deoarece fișierul nu a fost găsit. Apoi, script-ul terminat, iar restul fișierelor nu sunt citite.,

valoarea $ErrorActionPreference este valabilă numai în sesiunea PowerShell curentă. Se resetează la valoarea implicită odată ce o nouă sesiune PowerShell este pornit.

De ErrorAction Parametru Comun

$ErrorActionPreference valoarea este aplicat PowerShell sesiune, ErrorAction parametru se aplică la orice cmdlet care acceptă parametri comuni. Parametrul ErrorAction acceptă aceleași valori pe care le face variabila $ErrorActionPreference.,

ErrorAction valoarea parametrului prevalează asupra $ErrorActionPreference valoare.

să ne întoarcem și să folosim același cod în exemplul anterior. Dar, de data aceasta, parametrul ErrorAction este adăugat la linia Get-Content.

După rularea modificat codul, veți vedea că, chiar dacă $ErrorActionPreference este setat la Continue, script-ul încă încheiată după ce a întâlnit o eroare., Scenariul reziliat pentru că -ErrorAction valoarea parametrului în Get-Content este setat la STOP.

Forțând-o încheiere de eroare folosind ErrorAction parametrul

Folosind PowerShell Încerca Prinde Blocuri

În acest punct, ai învățat despre PowerShell erori și cum $ErrorActionPreference variabilă și ErrorAction parametrii de lucru., Acum, este timpul să înveți despre lucrurile bune – blocurile PowerShell Try Catch Finally.

PowerShell try catch blocuri (și, opțional finally block) sunt o modalitate de a arunca o plasă în jurul valorii de o bucată de cod și prinde orice erori care se întorc.

codul de mai jos arată sintaxa instrucțiunii Try.

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

blocul Try conține codul pe care doriți ca PowerShell să „încerce” și să monitorizeze Erorile., Dacă codul în Try bloc întâlnește o eroare, eroarea este adăugat la $Error variabilă și apoi a trecut la Catch bloc.

blocul Catch conține acțiunile de executat atunci când primește o eroare de la blocul Try. Pot exista mai multe blocuri Catch într-o declarație Try.

Finally bloc care conține cod care va fi la sfârșitul Try declarație., Acest bloc se execută dacă este sau nu o eroare a fost uncounted.

Prinderea Non-Specifice de Erori (Catch-All)

O Try declarație conține o Try și un Catch bloc. Blocul Finally este opțional.

de exemplu, pentru a prinde o excepție nespecifică, parametrul Catch ar trebui să fie gol. Codul exemplu de mai jos este folosind același script care a fost folosit în $ErrorActionPreference secțiune variabilă dar modificat pentru a utiliza Try Catch blocuri.,

după Cum puteți vedea de la codul de mai jos, de data asta, foreach declarație este închisă în interiorul Try bloc. Apoi, un Catch bloc conține codul pentru a afișa șirul An Error Occurred dacă s-a întâmplat o eroare. Codul din blocul Finally șterge doar variabila $Error.codul de mai sus, după rularea în PowerShell, vă va oferi această ieșire prezentată mai jos.,

Script terminată atunci când a apărut o eroare

ieșire de mai sus arată că scenariul a întâlnit o eroare, a fugit de cod în interiorul Catch bloc, și apoi a încetat.

eroarea a fost tratată, care a fost punctul de eroare de manipulare. Cu toate acestea, eroarea afișată a fost prea generică. Pentru a afișa o eroare mai descriptivă, puteți accesa Exceptionproprietatea erorii care a fost transmisă de bloculTry.,

codul De mai jos este modificat, în special codul din interiorul Catch bloc, pentru a afișa mesajul de excepție de la nivelul actual de eroare care a fost trecut în jos conducta – $PSItem.Exception.Message

de Această dată, atunci când a modificat codul de mai sus este rulat, mesajul afișat este mult mai descriptiv.,

Script încheiată cu un mesaj de eroare descriptiv

Prinderea Erorilor Specifice

Există momente când un catch-all eroare de manipulare nu este cea mai potrivită abordare. Poate că doriți ca scriptul dvs. să efectueze o acțiune care depinde de tipul de eroare întâlnit.

cum determinați tipul de eroare? Prin verificarea TypeNamevaloarea Exception proprietatea ultimei erori., De exemplu, pentru a găsi tipul de eroare din exemplul anterior, utilizați această comandă:

$Error.Exception | Get-Member

rezultatul codului de mai sus ar arăta ca imaginea de mai jos. După cum puteți vedea, valoarea TypeName este afișată – System.Management.Automation.ItemNotFoundException.

Obținerea de eroare TypeName valoare

Acum, că știți de eroare tipul de care aveți nevoie pentru a intercepta, de a modifica codul pentru a-l prinde în mod special., După cum vedeți din codul modificat de mai jos, acum există două blocuri Catch. Primul Catch bloc interceptează un anumit tip de eroare (System.Management.Automation.ItemNotFoundException). În schimb, al doilea Catch bloc conține mesajul de eroare generic, catch-all.

Imaginea de mai jos arată ieșirea Codului modificat de mai sus.,

Script încheiată cu un mesaj de eroare specific

Concluzie

În acest articol, ai învățat despre erori în PowerShell, proprietățile sale, și cum se poate determina o eroare specific de tip. Te-am învățat, de asemenea, diferența între cum $ErrorActionPreference variabilă și ErrorAction parametru afectează modul în PowerShell tratează non-încheiere erori.,

de asemenea, ați învățat cum să utilizați blocurile PowerShell Try Catch Finally pentru a efectua gestionarea erorilor, fie pentru erori specifice, fie pentru o abordare catch-all.exemplele prezentate în acest articol demonstrează doar elementele de bază ale modului în care funcționează blocurile Try Catch Finally. Cunoștințele pe care sper că le-ați câștigat în acest articol ar trebui să vă ofere blocurile de pornire pentru a începe să aplicați manipularea erorilor în scripturile dvs.,

bibliografie

  • About_Try_Catch_Finally
  • About_Automatic_Variables
  • Înapoi la elementele de Bază: PowerShell Buclă foreach
  • Înapoi la elementele de Bază: Înțelegerea PowerShell Obiecte

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *