POWERSHELL - polja

Prošli put spomenuli smo kako pojedine varijable u PowerShellu mogu imati vrlo složen sadržaj, na primjer mrežnu konfiguraciju računala. Iako se na prvi pogled čini kako je u takvim varijablama samo riječ o velikoj količini običnog teksta, zapravo se složene varijable sastoje od velikog broja “manjih dijelova”. A svakom od dijelova može se pristupiti posebno.

 

slika01.png

Slika 1.  Primjer varijable sa složenim sadržajem

 

Prikažimo mogućnost pristupa pojedinim dijelovima varijable pomoću nekoliko sljedećih naredbi:

 

$config.count
34
$config[5]

$config[6]
Media State . . . . . . . . . . . : Media disconnected
$config[7]
Connection-specific DNS Suffix  . :

 

Pomoću prve naredbe moguće je dobiti broj dijelova od kojih se sastoji neka složena varijabla. U ovom slučaju, na računalu gdje je pisan tekst, to je broj 34. Također, moguće je pristupiti svakom pojedinom dijelu varijable preko njegovog indeksa, što uključuje i prazne redove, to jest elemente koji samo predstavljaju razmak između drugih podataka u složenoj varijabli.

 

slika02.png

Slika 2.  Pristup pojedinim dijelovima složene varijable

 

Varijable sastavljene od većeg broja osnovnih dijelova s mogućnosti pristupa svakom pojedinom dijelu preko istog imena varijable i različitog indeksa (u ovom slučaju navedenog u uglatoj zagradi) nazivaju se (baš kao i u drugim programskim jezicima) polja.

 

Jedna od najčešćih stvari koju u praksi treba napraviti sa sadržajem polja je pronalaženje točno određenog elementa filtriranjem sadržaja elemenata. Na primjer, ako u prethodnoj varijabli želimo pronaći sve elemente gdje  se spominje veza (connection), mogli bismo upisati naredbu poput sljedeće:

 

$config | Where-Object { $_ -like "*Conn*" }

   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . :
   Connection-specific DNS Suffix  . :
   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . :
   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . :
   Connection-specific DNS Suffix  . : home

 

Za razliku od naredbe ipconfig, koja kao rezultat izvođenja vraća polje običnih tekstualnih elemenata, dio narebi kao rezultat može vratiti polje objekata. Primjer takve naredbe je dir. Pogledajmo primjer:

 

$files = dir
$files.count
35
$files[2]
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----      24.11.2018.     21:30                .cisco

 

U ovom slučaju pristup pojedinom elementu polja $files donosi nešto složeniji prikaz vrijednosti. Umjesto jednog reda teksta prikazuje se nekoliko različitih vrijednosti tog objekta, a za svaku vrijednost objekta prvo je naveden njezin naziv. U ovom konkretnom slučaju riječ je o datoteci ili mapi, a svaka mapa može imati različite vrijednosti za datum i vrijeme nastanka, zadnji pristup, naziv i slično.

 

Razlika između osnovnih elemenata je još uočljivija na sljedećem primjeru detaljnog prikaza vrijednosti pojedinog elementa polja.

 

slika03.png

Slika 3.  Razlika u prikazu jednostavnog i složenog elementa polja

 

U prvom slučaju i dalje se prikazuje obična tekstualna vrijednost zadanog elementa polja $config, dok se u drugom slučaju detaljno prikazuju sve dostupne vrijednosti pojedinog objekta polja $files.

 

Polje ne mora uvijek nastati kao rezultat izvođenja odgovarajuće naredbe, nego se može zadati navođenjem njegovih početnih vrijednosti. Pri tome sve navedene vrijednosti ne moraju biti iste vrste. Na primjer, sljedeća naredba kombinira nizove znakova, brojeve i datume u istom polju.

 

$test = "Ovo je", "primjer polja s različtim vrstama vrijednosti", 1, 2, 3, (Get-Date)

$test
Ovo je primjer polja s različtim vrstama vrijednosti
1
2
3

16. studenog 2019. 20:32:22

 

Po potrebi može se definirati i potpuno prazno polje, a onda mu se naknadno, tijekom izvođenja skripte, mogu dodavati različite vrijednosti.

 

$prazno = @()
$prazno += "prvi element"
$prazno += "drugi element"
$prazno += 3
$prazno += 4

$prazno
prvi element
drugi element
3
4

 

Kod prethodno prikazanog načina dodavanja novog elementa postoje dva problema:

  1. Novi element može se dodati isključivo na kraj polja.
  2. U pozadini se, zapravo, izvodi vrlo složena (spora) operacija pripreme novog polja i kopiranja svih prethodnih elemenata starog polja u novo polje, uz dodatak novog elementa na kraju novog polja. Puno operacija čije izvođenje u pozadini zahtijeva određeno vrijeme i resurse.

 

Za mnogo fleksibilniji i djelotvorniji rad, polja se mogu pretvoriti u objekt ArrayList. S takvim objektom moguće je dodati novi element na bilo koje mjesto u polju, obrisati neki od postojećih elemenata, izvoditi sortiranje elemenata i slično. Evo nekoliko primjera:

 

$lo = [System.Collections.ArrayList]$prazno 
$lo.Insert(2,"novi element")
$lo.RemoveAt(4)
$lo                                                                                               
prvi element
drugi element
novi element
3

 

Svoju pravu snagu upotreba polja pokazuje u složenim skriptama, zajedno s odgovarajućim kontrolnim strukturama, što ćemo pokazati u sljedećim nastavcima.

Kategorija: