POWERSHELL - kontrolne strukture

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

 

1

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.

 

2

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.

 

3

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:

 

4

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.

Kategorija