Null w PowerShellu

Do specjalnej wartosci null w SQLu przyzwyczail sie chyba kazdy, kto z bazami danych mial do czynienia. Natomiast null w skryptach nie jest az tak oczywisty. Jezeli ktos na trwale ma w glowie, ze w PowerShellu wszystko jest obiektem a nie kawalkiem tekstu, to jest troche prosciej. Niemniej jednak i tak mozna sie czasem troche zdziwic albo zaskoczyc.

Wezmy najprostszy kawalek tekstu: $ala='Ala ma kota' I drugi: $ola='Ola ma psa' . I do eksperymentów trzeci: $pusty='' .

Mozemy sobie nimi zonglowac, pamietajac, ze to obiekty. Sens ma sprawdzenie $ala.Length czy wywolanie $ola.ToUpper() . Mozemy równiez zmontowac z nich tablice, chocby przez najprostsze: $tablica=$ala,$ola,$pusty Oczywiscie jak to z tablica bywa, mozemy uzywac indeksów pamietajac, ze zaczynamy od zera. A jezeli siegniemy po $tablica[99] ? PowerShell nic nie powie, ze bylo zle.

Zróbmy taki prosty skrypt:

for ($i=0; $i -le 2; $i++) {$pom=$tablica[$i]; Write-Host $pom, '- ' -nonewline; if ($pom.Length -eq 0) {Write-Host ' pusty.'} else { Write-Host ' niepusty.'}}

Mozna dywagowac o poprawnosci takiego podejscia, ale w skryptach czesto wystarczy, poza tym celowo upraszczam dla przykladu.

A jezeli siegne po cos, czego nie ma? Wystarczy zwiekszyc zakres petli.

image

I o co chodzi? Tak naprawde o to, czym jest ostatni badany element (czyli jak to w PowerShellu – obiekt). Zalozylismy, ze to string (lancuch tekstowy), w którym mozemy w prosty sposób badac dlugosc odczytujac wlasciwosc Length. Moze i pusty (o zerowej dlugosci), ale jednak string. A tymczasem, jezeli odwolamy sie do nieistniejacego elementu tablicy, to niby czemu mielibysmy dostac jakis obiekt typu string? Dostajemy tak zwanego nulla. Czyli obiekt, który jest niczym. I wszystkie jego wlasciwosci tez sa nullami. A skoro sa nullami, to nie sa liczba, czyli na pewno nie sa równe zero.

Troche tu pokutuje zupelnie nieobiektowe myslenie o tym, co sie wyswietla na ekranie, gdzie róznica miedzy tekstem pustym a brakiem tekstu praktycznie nie istnieje. Dla programisty to oczywiste. A typowemu adminowi niestety trudno czasem pojac, dlaczego brak tekstu w istniejacym obiekcie, to cos zupelnie innego niz brak calego obiektu.

Co z tym zrobic? Pamietac, ze obiekty moga czasem byc nullami. W róznych dziwnych sytuacjach (na przyklad wlasciwosc HomeDirectory zwracana przez Get-QADUser, o co sie ostatnio potknalem). I sprawdzac czy sa nimi, czy nie. W PowerShellu istnieje specjalna stala: $null, która zawsze jest nullem. Mozna z nia porównac dowolny inny obiekt, na przyklad tak:

image

I pamietac zawsze, ze w PowerShellu wszystko jest obiektem.

Autor: Grzegorz Tworek [MVP]