Jak w PowerShellu sprawdzić czy polecenie bądź skrypt wykonało się poprawnie

Stosując skrypty PowerShella z Harmonogramem Zadań, wykonujące się bardzo długo lub generujące duże ilości komunikatów dobrze sprawdzić stan poszczególnych operacji bądź przygotować podsumowanie ich wykonania.

Sposobów sprawdzenia czy polecenie, lub cały skrypt, wykonał się poprawnie jest dość sporo a przedstawione poniżej powinny wystarczyć do obsługi większości typowych przypadków.

Zmienna $?

Najprostszy sposób to użycie $? które przechowuje pomyślne wykonanie ostatniej operacji jako $true, a niepowodzenia jako $false.

PS C:\> $?
True
PS C:\> Resolve-DnsName tenadresnapewnonieistnieje.pl
Resolve-DnsName : tenadresnapewnonieistnieje.pl : Nazwa DNS nie istnieje
At line:1 char:1
+ Resolve-DnsName tenadresnapewnonieistnieje.pl
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (tenadresnapewnonieistnieje.pl:String) [Resolve-DnsName], Win32Exception
    + FullyQualifiedErrorId : DNS_ERROR_RCODE_NAME_ERROR,Microsoft.DnsClient.Commands.ResolveDnsName

PS C:\> $?
False
PS C:\>

Zmienna $LastExitCode

$LastExitCode przechowuje kod wyjścia ostatniego polecenia. Choć w tej kwestii brakuje standardu, to programiści stosują się do konwencji w której zero oznacza pomyślne wykonanie zaś inne wartości błąd.

Użycie $LastExitCode jest wskazane gdy polecenie zwraca wiele różnych kodów wyjścia i trzeba je w jakiś sposób obsłużyć. Dobrym przykładem jest popularny program do synchronizacji i kopiowania danych Robocopy. Obsługa jego wielu kodów wyjścia za pomocą $LastExitCode sprawdza się znakomicie.

PS C:\> $LastExitCode
0
PS C:\> ping tenadresteznapewnonieistnieje.pl
Ping request could not find host tenadresteznapewnonieistnieje.pl. Please check the name and try again.
PS C:\> $LastExitCode
1
PS C:\>

Zmienna $error

Ostatnie 256 błędów napotkanych podczas sesji PowerShella przechowywanych jest w tablicy $error. Co ważne, kolejne błędy dodawane są na jej początku i aby pobrać informacje o najnowszym z nich można odwołać się bezpośrednio do $error[0].

Jest to bardzo wygodny sposób by ustalić czy w czasie wykonywania skryptu coś poszło nie tak. Ten metoda najlepiej się sprawdza gdy sesja tworzona jest wyłącznie w celu jego uruchomienia. Na przykład z użyciem Harmonogramu Zadań.

Logika zawarta w skrypcie może niewłaściwie zareagować na błędy jakie wystąpiły przed jego uruchomieniem, nawet gdy ten wykonał się pomyślnie. Można jednak temu zaradzić wywołując $error.clear() co wyczyści zmienną.

PS C:\> $error
Resolve-DnsName : tenadresnapewnonieistnieje.pl : Nazwa DNS nie istnieje
At line:1 char:1
+ Resolve-DnsName tenadresnapewnonieistnieje.pl
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (tenadresnapewnonieistnieje.pl:String) [Resolve-DnsName], Win32Exception
    + FullyQualifiedErrorId : DNS_ERROR_RCODE_NAME_ERROR,Microsoft.DnsClient.Commands.ResolveDnsName

PS C:\>