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?
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
.
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
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
Pentru a determina motivul pentru eroare, puteți vizualiza conținutul InvocationInfo
proprietatea, folosind comanda de mai jos.,
$Error.InvocationInfo
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.
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
.,
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.
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 $ErrorActionPreference
este setată la Continue
. Modificarea valorii variabilei $ErrorActionPreference
la STOP
forț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
.,
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
.
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.,
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 Exception
proprietatea 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.,
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 TypeName
valoarea 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
.
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.,
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