După cum sugerează și numele, PowerShell este mult mai puternic decât promptul de comandă standard din Windows. Odată cu această putere vine și o posibilitate mai mare de erori derutante. Dacă scriptul dvs. eșuează brusc, este posibil să nu știți de unde să începeți să căutați ce a mers prost. Aici este momentul în care gestionarea erorilor din PowerShell este utilă.
Dacă sunteți familiarizat cu alte limbaje, probabil că știți elementele de bază ale gestionării erorilor, dar există unele aspecte specifice PowerShell pe care va trebui să le cunoașteți. Există patru părți ale gestionării erorilor în PowerShell: parametrul Error Action, blocurile Try/Catch, parametrul Error Variable și jurnalizarea.
PowerShell Error Handling the Easy Way
Primul pas în gestionarea erorilor PowerShell este să te ocupi de ceva care îți oprește scriptul în calea sa. Dacă eșecul nu afectează restul scriptului dumneavoastră, ar putea fi cel mai bine să-i spuneți lui PowerShell să ignore erorile și să treacă mai departe.
Pe de altă parte, nu este întotdeauna clar când un anumit cmdlet aruncă o eroare de terminare. Unele cmdlet-uri returnează o eroare, dar nu vă opresc scriptul. Acest lucru ar putea să vă lase să așteptați finalizarea scriptului dvs. în timp ce acesta emite prostii.
Aici intervine parametrul -ErrorAction. Îl utilizați pentru a forța un cmdlet să trateze eroarea în modul în care doriți. Dacă modificați un script existent, îl adăugați la sfârșitul liniei cmdletului.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop
Evident, dacă folosiți cmdlet-ul Get-ChildItem de unul singur, această eroare nu face prea multe pentru dumneavoastră. Cu toate acestea, dacă doriți să faceți ceva cu datele, ar fi bine să opriți scriptul, astfel încât să știți că căutarea a eșuat și de ce. Alternativ, dacă efectuați mai multe căutări, schimbați parametrul din Stop în SilentlyContinue, astfel încât scriptul să continue dacă o căutare eșuează. Dacă doriți să vedeți care este eroarea, puteți folosi Continue ca parametru în schimb.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction SilentlyContinue
Dacă preferați să aveți opțiunea de a controla ce se întâmplă de fiecare dată când se execută scriptul, puteți schimba parametrul în Inquire. Atunci când cmdlet-ul dvs. întâmpină o piedică, acesta oferă opțiuni: Yes, Yes For All, Halt Command, Suspend, sau Help.
Această opțiune este un pic mai flexibilă, dar înseamnă că erorile fac ca scriptul dvs. să aștepte introducerea dvs. Acest lucru este în regulă dacă utilizați PowerShell pentru a trimite un e-mail sau o altă sarcină simplă, dar s-ar putea să nu fie ceva ce vă doriți atunci când executați un proces lung peste noapte.
PowerShell Error Handling the PowerShell Error Way the Powerful Way
Parametrul ErrorAction vă abordează erorile într-un mod necomplicat. Cu toate acestea, dacă sunteți în căutarea unui control un pic mai mare asupra erorilor, PowerShell încă vă are acoperit. Folosind Try/Catch, putem acum să bifurcăm scriptul atunci când cmdlets returnează o eroare.
După cum sugerează și numele, Try/Catch este alcătuit din două părți. (Există, din punct de vedere tehnic, o a treia, dar vom ajunge la aceasta într-un minut.) Prima este secțiunea Try. În această secțiune veți rula codul dumneavoastră normal. Veți folosi în continuare parametrul -ErrorAction, dar acesta poate fi setat doar ca Stop. Acest indicator asigură faptul că cmdlet-ul dvs. declanșează Catch – chiar dacă nu are o eroare de terminare.
Try{
Get-Process "Cortana" -ErrorAction Stop
}
Try poate, de asemenea, să împiedice rularea altor cmdlet-uri în cazul în care căutarea eșuează. În acest caz, dacă trimiteați rezultatele Get-Process la Stop-Process, o căutare eșuată împiedică rularea celui de-al doilea cmdlet.
Așadar, acum că ați creat un bloc de cmdlet-uri try, ce doriți să faceți atunci când acesta eșuează? Folosind jumătatea Catch, veți defini acest lucru.
Catch{
Write-Host "Process Not Found"
}
Ca și în cazul parametrului ErrorAction, atunci când faceți ceva un pic mai complex, Catch va fi util pentru mai mult decât pentru a da un eșec în limbaj simplu, mai ales atunci când faceți ceva un pic mai complex. (În exemplul de mai sus, eșecul este forțat prin utilizarea numelui aplicației, și nu a numelui procesului). Așadar, asigurați-vă că vă jucați cu blocul Try pentru a crea o căutare/acțiune de care aveți nevoie. Puteți folosi blocul Catch pentru ca scriptul dvs. să vă trimită un e-mail dacă eșuează.
A treia parte vine la îndemână dacă doriți ca ceva să se execute indiferent dacă cmdlet-ul dvs. reușește sau nu. Pentru aceasta, puteți utiliza blocul Finally. Adăugați acesta după Try și Catch și înregistrați atunci când o secțiune a scriptului dvs. se încheie.
Variabila Error și logarea
Scriptul dumneavoastră controlează acum modul în care gestionează erorile și cum răspunde la acestea. Îl puteți utiliza ca o sarcină programată sau, cel puțin, îl puteți rula atunci când nu sunteți la birou. Cu toate acestea, cum puteți investiga un script eșuat? Cu ajutorul parametrului -ErrorVariable, erorile cmdlet-ului dvs. se scriu într-o variabilă personalizată.
Aceasta este o alternativă la variabila de sistem $Error, care conține toate erorile din sesiunea curentă.
cmdlet-ul dvs. trebuie să devină un pic mai lung. Mai întâi, definiți o variabilă, ceva de genul $SearchError va fi suficient pentru acest exemplu. Când apelați SearchError în parmetrul ErrorVariable, nu folosiți semnul dolarului.
Chiar dacă apelați o variabilă pe care ați creat-o, din cauza modului în care funcționează parametrul, o apelați fără semnul dolarului. Apoi adăugați asta la sfârșitul liniei.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Continue -ErrorVariable SearchError
Dacă adăugați un + în fața numelui variabilei, puteți adăuga la variabilă mai degrabă decât să o înlocuiți pur și simplu. Astfel, veți obține același comportament ca și în cazul variabilei globale de eroare. În schimb, puteți utiliza această ieșire și Try/Catch pentru a scrie o ieșire personalizată și pentru a o marca în timp.
Pentru ca acest lucru să funcționeze, creați un fișier text imediat după ce ați setat variabila de eroare. Faceți acest lucru cu ajutorul cmdletului New-Item. Este posibil să doriți să utilizați opțiunea Inquire pentru parametrul ErrorAction. Acest lucru vă permite să adăugați la un jurnal existent atunci când cmdlet-ul New-Item eșuează.
$SearchLog = New-Item "~\SearchLog.txt" -type file -ErrorAction Inquire
Acum, când vă construiți blocul Try/Catch, puteți utiliza Catch pentru a înregistra într-un fișier text. Folosiți Get-Date pentru a crea marca de timp. Formatarea poate fi înșelătoare, așa că asigurați-vă că ați copiat-o din exemplu.
Try{
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop -ErrorVariable SearchError
}
Catch{
Add-Content -Path $SearchLog -Value "$(Get-Date -Format dd-MM-yy-hh_mm_ss) Files not found returned error: $SearchError"
}
Repetați acest lucru după cum este necesar pentru toate cmdlet-urile dvs. și acum aveți un jurnal frumos al tuturor erorilor. Dacă doriți să urmăriți lucrurile care se execută cu succes, puteți adăuga un Add-Content similar la sfârșitul blocului Try.
Această logare se execută numai atunci când cmdlet-ul Try reușește. Puteți apoi să vă înregistrați erorile și succesele cu marcaje de timp. Jurnalizarea vă permite acum să știți tot ceea ce a făcut scriptul dvs., cu succes sau eșec.
PowerShell nu este singura dvs. opțiune
Deși PowerShell este un instrument util pentru o mulțime de sarcini Windows, poate fi greu de învățat. De asemenea, nu este potrivit pentru orice. Dacă faceți mentenanța sistemului pe computerul dumneavoastră sau verificați integritatea unui fișier, PowerShell este la îndemână. Pe de altă parte, dacă doriți să executați un script pentru a descărca fișiere de pe internet sau o sarcină mai generală, aveți alte opțiuni.
De exemplu, dacă veniți dintr-un mediu Unix sau Linux, s-ar putea să vă simțiți mai confortabil folosind shell-ul bash. Mulțumită subsistemului Windows pentru Linux, acum puteți utiliza cu ușurință bash și alte instrumente Linux pe computerul dvs. cu Windows 10. Dacă acest lucru vă sună perfect, nu căutați mai departe de ghidul nostru pentru a face să funcționeze shell-ul bash pe Windows 10.
Kris Wouk este muzician, scriitor și orice se numește atunci când cineva face videoclipuri pentru web. Pasionat de tehnologie de când se știe, are cu siguranță sisteme de operare și dispozitive preferate, dar oricum folosește oricum cât mai multe altele, doar pentru a fi la curent.
Mai multe de la Kris Wouk