Kao i drugi programski jezici koji se koriste za pisanje složenijih skripti ili programa, tako i jezik ugrađen u PowerShell ima ugrađene različite kontrolne strukture za uvjetno izvođenje dijelova programskog koda, odnosno za njihovo višestruko ponavljanje. Budući da je po ovom pitanju PowerShell dosta sličan drugim “C-olikim” programskim jezicima, u ovom nastavku ćemo se prije svega pozabaviti najvažnijim razlikama.
Jednu od najuočljivijih i najvažnijih razlika navodimo na samom početku teksta. Umjesto standardnih operatora za uspoređivanje vrijednosti, kao što su =, <, >, koriste se posebne skraćenice.
Standardni operator |
PowerShell |
Opis |
= |
-eq, -ceq, -ieq |
jednako |
<> |
-ne, -cne, -ine |
nije jednako |
< |
-lt, -clt, -ilt |
manje od |
<= |
-le, -cle, -ile |
manje ili jednako |
> |
-gt, -cgt, -igt |
veće od |
>= |
-ge, -cge, -ige |
veće ili jednako |
|
-contains, -ccontains, -icontains |
sadrži |
|
-notcontains, -cnotcontains, -inotcontains |
ne sadrži |
Razlika u oznakama operatora posljedica je načina na koji se rezervirani znakovi =, <, > koriste u PowerShellu. Znak “=“ koristi se za dodjeljivanje vrijednosti varijablama, a ostala dva za redirekciju podataka između naredbi. Zato su operatori za uspoređivanje dobili poseban oblik prema početnim slovima engleskih riječi za uspoređivanje. Na primjer, -lt je skraćenica od “less that” odnosno “manje od”.
Zašto za svaki operator postoji verzija s dodatnim slovima “c” ili “i” na početku? Pomoću njih se dodatno može upravljati načinom na koji djeluje neki od operatora tako da se u obzir uzima veličina znakova (c - case sensitive), ili se ne uzima (i - case insensitive).
Operatori za uspoređivanje mogu se koristiti i za uspoređivanje različitih vrsta podataka, ali se pri tome automatski izvodi pretvaranje različitih vrsta podata u istu vrstu. Podatak iza operatora za uspoređivanje pretvara se u istu vrstu kao što je to podatak ispred operatora, a tek nakon toga se izvodi uspoređivanje. Kako je pretvaranje podataka automatski postupak, ponekad se mogu dobiti na prvi pogled neočekivani rezultati pa treba biti pažljiv u takvim situacijama.
Operatorima za uspoređivanje mogu se uspoređivati i polja. Evo primjera u kojem je polje brojeva pripremljeno za uspoređivanje jednostavnim nabrajanjem elemenata međusobno odvojenih zarezom.
2, 4, 6, 8, 10, 12 -eq 6
6
2, 4, 6, 8, 10, 12 -ne 6
2
4
8
10
12
U oba slučaja operator za uspoređivanje djeluje kao neka vrsta filtra te vraća sve elemente polja za koje je rezultat upoređivanja točan.
Kod pripreme složenijih izraza mogu se koristiti logički operatori. Budući da je njihovo ponašanje jednako kao u drugim programskim jezicima, a razlikuju se u načinu pisanja, u nastavku ćemo samo nabrojiti dostupne logičke operatore: -and, -or, -xor i -not.
Provjera vrijednosti izraza može se koristiti u različitim kontrolnim strukturama koje su, manje ili više, slične onima iz drugih programskih jezika:
If … Elseif … Else
Switch
For
Foreach
ForEach-Object
Do … While
Slika 1. Primjer izvođenja If … Elseif naredbe
Dok je kod naredbe If .. Elseif sve poznato iz drugih jezika, kontrolna struktura Switch omogućava različite vrste postavljanja (složenih) uvjeta kod provjere vrijednosti neke varijable. Najlakše je to objasniti primjerom na sliedećoj slici.
Slika 2. Napredne mogućnosti naredbe switch
Iz ranije spomenutog popisa kontrolnih struktura vidljivo je da su na raspolaganju sve standardne kontrolne strukture koje omogućavaju provjeru uvjeta za izvođenje petlje na početku ili na kraju, odnosno ponavljanje izvođenja petlje točno određeni broj puta.
Također, omogućeno je je prijevremeno napuštanje petlje pomoću naredbe break te preskakanje određenog ponavljanja petlje uz nastavak njezinog izvođenja pomoću naredbe continue.
Slika 3. Primjer For petlje uz naredbe break i continue
Budući da PowerShell podržava dvije “foreach” varijante, objasnimo razlike između njih, jer su prilično bitne. ForEach-Object predstavlja najjednostavniji način za obradu svih rezultata koje vrati neka druga naredba, te je istovremeno pogodna za korištenje u “kanalu” većeg broja naredbi. Foreach predstavlja “običnu” petlju za prolazak kroz sve elemente neke kolekcije, ali se ne može koristiti u kanalu. Slijede primjeri korištenja obje petlje:
Slika 4. Primjeri korištenja kontrolnih struktura ForEach-Object i Foreach
Iako prethodna dva primjera vraćaju iste rezultate, potpuno se razlikuju po internom mehanizmu izvođenja, što je posebno uočljivo kod ogromnog broja objekata/elemenata. ForEach-Object omogućava obradu pojedinačnog objekta u kanalu objekt po objekt, što znači da se prvi rezultati dobivaju odmah nakon zadavanja naredbe. Kod petlje Foreach prvo se priprema cijela kolekcija rezultata, a tek onda počinje izvođenje petlje. U tom pogledu ForEach-Object je u prednosti u brzini dobivanja prvih rezultata, ali zato obrada pojedinačnog elementa (nakon što je dovršena priprema kolekcije) traje kraće kod druge petlje. Na programeru je da izabere bolju varijantu u konkretnom slučaju.
S kontrolnim strukturama iz ovog teksta susretat ćemo se kod složenijih skripti, tako da će o nekim njihovim posebnostima još biti riječi u budućim nastavcima.