Una dintre principalele piese de orice bun PowerShell script este eroare de manipulare. Chiar și în cel mai scurt scenariu, capacitatea de a gestiona Erorile vă ajută să vă asigurați că un eveniment neașteptat nu va continua să distrugă sistemul la care lucrați. Luați exemplul de mai jos. În fiecare săptămână în compania noastră de probă (MyCompany.Com) resursele umane vor încărca o listă care ne va spune cine ar trebui să aibă acces la baza de date de cheltuieli., Dacă un nume nu se află în listă din HR, îl vom elimina din grup și acel utilizator nu va mai putea înregistra revendicări de cheltuieli:
acum, Puteți vedea unde va merge prost. O săptămână HR nu ajunge în jurul valorii de a încărca lista sau, la fel cum suntem pe cale de a accesa lista, serverul de fișiere moare. Dintr-o dată PowerShell aruncă o eroare pe cmdlet-ul Get-Content, iar variabila $AuthorizedUser rămâne goală. Deoarece scriptul nostru nu gestionează Erorile, continuă să ruleze și, într-un timp foarte scurt, a eliminat fiecare utilizator din grupul nostru de cheltuieli., Destul de curând apelurile telefonice iritat începe inundații în și viața devine un pic mai puțin fericit. Modul de a evita toate acestea este de a prinde erorile și apoi se ocupe de evenimentul care le-a provocat (care, în acest caz, este opri script-ul și au un strigăt la cineva în HR).
erori de terminare și Non-terminare
unul dintre lucrurile cheie de știut atunci când capturați erori este că numai anumite erori pot fi surprinse în mod implicit. Erorile vin în două tipuri-terminare și non-terminare. O eroare de terminare este o eroare care va opri o funcție sau o operație., Dacă faceți o eroare de sintaxă sau rămâneți fără memorie, aceasta este o eroare de terminare. Erorile de terminare pot fi prinse și manipulate. Erorile care nu se termină permit Powershell să continue și de obicei provin din cmdleturi sau alte situații gestionate. În condiții normale, acestea nu pot fi prinse de Try-Catch-în cele din urmă. Eroarea Get-Content din exemplul de mai sus este o eroare care nu se termină.
tratarea erorilor Non-terminare ca terminare
Deci, cum te prind o eroare Non-terminare? Practic, îi spui lui PowerShell să o trateze ca pe o încheiere. Pentru a face acest lucru, utilizați parametrul ErrorAction., Fiecare cmdlet PowerShell acceptă ErrorAction. Prin specificarea-ErrorAction Stop la sfârșitul unui cmdlet vă asigurați că orice erori pe care le aruncă sunt tratate ca terminare și pot fi prinse. În exemplul nostru de mai sus vom schimba linia Get-Content la:
$AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop
tratarea tuturor erorilor ca terminare
de asemenea, este posibil să tratăm toate erorile ca terminare folosind variabila ErrorActionPreference. Puteți face acest lucru fie pentru scriptul cu care lucrați, fie pentru întreaga sesiune PowerShell. Pentru a-l seta într-un script, faceți prima linie $ErrorActionPreference = Stop., Pentru a o seta pentru sesiune, tastați $ErrorActionPreference = Stop la consola PowerShell.după ce v-ați asigurat că eroarea pe care încercați să o prindeți va fi tratată ca încheiată, puteți construi un bloc de încercare în jurul comenzii (sau comenzilor) care ar putea cauza eroarea. Prima etapă este de a înconjura secțiunea de script-ul dvs., care poate arunca eroarea cu un bloc Try. În exemplul nostru, linia Get-Content devine:
Try{ $AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop}
imediat după blocul de încercare, trebuie să plasați un bloc de captură pentru a face față erorii., Blocul de captură este accesat numai dacă apare o eroare de terminare, altfel este ignorat. În exemplul nostru, vom trimite un e-mail unui administrator pentru a spune că a apărut o eroare și apoi vom opri scriptul. Linia noastră Get-Content este acum:
accesarea înregistrării erorilor
odată ce vă aflați într-un bloc de captură, puteți accesa înregistrarea erorilor, care este stocată în variabila obiect curentă,$_. Înregistrările de eroare au diverse proprietăți utile, dar principala pe care doriți să o accesați este $_.Excepție., Excepțiile sunt ceea ce avem de – a face cu adevărat aici, pe măsură ce prindem și tratăm Erorile-excepțiile sunt evenimentul neașteptat care a provocat eroarea (înregistrarea erorilor în sine este de fapt doar un înveliș pentru prezentarea excepției utilizatorului PowerShell). Este excepția pe care o prindem și excepția care conține toate informațiile cu adevărat utile despre problemă. Dacă a existat o altă problemă care a cauzat excepția noastră, aceasta este înregistrată și la $_.excepție.innerexception (și așa mai departe – următoarea excepție de bază este stocată la $_.excepție.innerexception.,innerexception etc.). În scopul exemplului nostru, vom folosi $_.Excepție pentru a pune unele informații suplimentare în e-mailul nostru de notificare, folosind $_.Excepție.Mesaj și$_.Excepție.ItemName properties:
prinderea excepții specifice
acum, ca exemplul nostru standuri suntem prinderea orice erori care apar în timpul fișierului citit și care se ocupă cu toate acestea în același mod. Cu toate acestea, puteți prinde excepții specifice și le puteți trata diferit, dar – și este un mare dar – numai dacă eroarea inițială se termină., Pentru a Obține Conținut cmdlet aruncă non-încheiere erori (care trebuie tratate doar ca încheiere, folosind ErrorAction) nu putem special a prinde diferite excepții care cmdlet-ar putea arunca. Aceasta este o caracteristică a PowerShell și se aplică oricărei erori care nu se termină, indiferent de ErrorActionPreference și nu poate fi modificată. Cu toate acestea, putem face față altor excepții de terminare, cum ar fi o eroare de memorie, care ar putea apărea în timpul operației de citire. În sensul acestui exemplu, asta vom face.,puteți prinde erori de terminare specifice specificând numele excepției imediat după cuvântul cheie captură. În exemplul nostru vrem să prindem un sistem.OutOfMemory excepție și, dacă vom obține unul, va lua abordarea fără prostii de repornire a computerului imediat. Vom include, de asemenea, un bloc de captură generală după fișierul nostru nu a fost găsit bloc pentru a prinde toate celelalte excepții:
în cele din urmă, folosind în cele din urmă
Ultima parte a Încercați captura în cele din urmă este în cele din urmă bloc. Acest lucru trebuie definit imediat după blocul de captură și rulează de fiecare dată, indiferent dacă a existat o eroare sau nu., În acest fel, puteți efectua acțiuni care trebuie făcute indiferent dacă o operațiune reușește sau nu. În exemplul nostru, vom înregistra că a fost încercat un fișier citit. Linia noastră Get-Content arată acum: