Intro to handling errors in Powershell–default variables

By Andrei Ungureanu - Last updated: Wednesday, October 26, 2016 - Save & Share - Leave a Comment

In majoritatea cazurilor, adminii nu prea ajung in zona de error handling, pentru ca multe din interactiunile cu Powershell se rezuma la a compune comenzi intr-o singura linie iar errorile le trateaza ad hoc.

Dar chiar si atunci e bine sa stii cate ceva despre mecanismele din Powershell care te pot ajuta. Cel mai simplu examplu ar fi cazul in care am dori sa listam toate erorile aparute in sesiunea curenta de powershell (poate ca cineva a rulat CLS pentru a-si ascunde urmele si ne lasa pe noi sa ne chinuim fara sa ne spuna rezultatul incercarilor lui).

In fiecare sesiune erorile sunt stocate automat intr-o variabila default numita $error. Ca exemplu incerc sa import un modul inexistent:

image

Pasul urmator este sa sterg consola ruland CLS. Dar ruland $error, pot vedea mesajul de eroare aparut mai devreme si orice alt mesaj de eroare aparut in sesiunea curenta:

image

$error este un array ce by default este setat sa stocheze pana la 256 de intrari. Ultima intrare in array poate fi accesata cu $error[0]:

image

Dimensiunea maxima a $error poate fi vazuta si modificata prin variabila default $MaximumErrorCount:

image

Pentru a vedea cate erori sunt stocate pentru sesiunea curenta apelam $error.count:

image

Iar pentru a sterge orice urma de erori folosim $error.clear():

image

De retinut ca este important ca la finalul unui script sa poti verifica daca au aparut erori, eventual sa le salvezi si foarte important sa stergi continutul variabilei $error, pentru ca la o executie urmatoare sa capturezi doar erorile aparute ca urmare a ultimei executii si nu tot ce aparut pana atunci.

Si tot in aceasta categorie mai exista o variabila ce trebuie retinuta si anume $LastExitCode. Aceasta variabila este importanta pentru cand apelam comenzi sau scripturi externe si stocheaza codul de erorare returnat de comanda apelata. Stim ca trebuie sa fie 0 pentru o executie cu succes. Orice e diferit de 0 poate reprezenta o problema. Nota: In propriile scripturi putem seta codul returnat la exit.

Iata de exemplu o insiruire de comenzi in care incerc sa opresc servicii folosind NET START/STOP:

image 

Observati ca la inceput variabila $lastexitcode este neinitializata, apoi ia valoarea zero iar mai tarziu se schimba in 2 cand incerc sa pornesc un serviciu inexistent.

Cam atat in acest scurt intro si sper sa va ajute si sa va dea idea despre cum puteti monitoriza si observa erorile din sesiunile sau scripturile Powershell.

Posted in Scripting • Tags: , Top Of Page

Write a comment