Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

Povijesno gledano, komandne linijske alate u Unix sustavima bolje su razvijene nego u Windowsu, no s pojavom novog rješenja situacija se promijenila.

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

PowerShell omogućuje pisanje skripti na interpretiranom višeparadigmatskom jeziku koji uključuje elemente klasičnog proceduralnog, objektno-orijentiranog, pa čak i funkcionalnog programiranja: uvjetne prijelaze, petlje, varijable, nizove, hesh-tabele, klase, obrada grešaka, kao i funkcije, cmdlet-e i cijevi. Prethodni članak bila je posvećena osnovama rada u okruženju, a sada čitateljima nudimo mali priručnik za programere.

Sadržaj:

Komentari
Varijable i njihovi tipovi
Sistemske varijable
Područja vidljivosti
Varijable okruženja
Aritmetički operatori i operatori usporedbe
Operatori dodjeljivanja
Logički operatori
Uvjetni prijelaz
Petlje
Nizovi
Hesh-tabele
Funkcije
Obrada grešaka

Kod se može pisati u bilo kojem tekstualnom editoru ili korištenjem integriranog razvojna okruženja — najlakše je uzeti Windows PowerShell ISE iz paketa poslužiteljskih operativnih sistema Microsoft. Ovo je potrebno samo za dovoljno složene skripte: kratke nizove komandi lakše je izvršavati u interaktivnom režimu.

Komentari

Korištenje komentara smatra se dijelom dobrog stilskog programiranja, uz pravilno poravnavanje i razmake:

# Для строчных комментариев используется символ решетки — содержимое строки интерпретатор не обрабатывает.

<# 

       Так обозначаются начало и конец блочного комментария. 
       Заключенный между ними текст интерпретатор игнорирует.

#>

Varijable i njihovi tipovi

Varijable u PowerShellu su imenovani objekti. Njihova imena mogu sadržavati znak podcrtavanja, kao i slova i brojeve. Ispred imena uvijek se koristi znak $, a za deklaraciju varijable dovoljno je navesti interpretatoru valjano ime:

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

Za inicijalizaciju varijable (dodjeljivanje joj vrijednosti) koristi se operator dodjeljivanja (simbol =):

$test = 100

Varijablu možete deklarirati navodeći njen tip u uglatim zagradama (operator konverzije tipa) ispred imena ili vrijednosti:

[int]$test = 100

$test = [int]100

Važno je razumjeti da su varijable u PowerShellu potpuno objekti (klase) s svojstvima i metodama čiji su tipovi zasnovani na .NET Core. Navodimo glavne:

Tip (klasa .NET)

Opis

Primer koda

[string]
System.String

Unicode string 

$test = "test"
$test = 'test'

[char]
System.Char

Unicode znak (16 bit)

[char]$test = 'c'

[bool]
System.Boolean

boolean tip (logička vrijednost True ili False)

[bool]$test = $true

[int]
System.Int32

cjelobrojni broj od 32 bita

[int]$test = 123456789

[long]
System.Int64

cjelobrojni broj od 64 bita

[long]$test = 12345678910

[single]
System.Single

broj s pomičnom točkom od 32 bita

[single]$test = 12345.6789

[double]
System.Double

broj s pomičnom točkom duljine 64 bita (8 bajtova)

[double]$test = 123456789.101112

[decimal]
System.Decimal

broj s pomičnom točkom duljine 128 bita (d na kraju mora biti navedeno)

[decimal]$test = 12345.6789d

[DateTime]
System.DateTime

datum i vrijeme 

$test = Get-Date

[array]
System.Object[]

niz čiji indeksi elemenata počinju od 0

$test_array = 1, 2, "test", 3, 4

[hashtable]
System.Collections.Hashtable

hash tablice — asocijativni nizovi s imenovanim ključevima, izgrađeni prema načelu: @{ključ = "vrijednost"}

$test_hashtable = @{one="jedan"; two="dva"; three="tri"}

PowerShell podržava implicitno prevođenje tipova, osim toga, tip varijable može se mijenjati u hodu (na primjer, putem operatora dodjele), ako nije izričito naveden — u tom slučaju tumač će dati pogrešku. Tip varijable iz prethodnog primjera može se odrediti pozivom metode GetType():

$test.GetType().FullName

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

Postoji određeni broj cmdleta za upravljanje varijablama. Njihov se popis u prikladnom obliku ispisuje pomoću naredbe:

Get-Command -Noun Variable | ft -Property Name, Definition -AutoSize -Wrap

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

Za pregled deklariranih varijabli i njihovih vrijednosti može se koristiti posebni cmdlet:

Get-Variable | more

Ovaj način se čini pretjerano opsežnim, s varijablama je puno prikladnije raditi putem operatora ili izravno se obraćajući njihovim svojstvima i metodama. Ipak, cmdleti imaju pravo na postojanje, jer omogućuju definiranje nekih dodatnih parametara. Važno je razumjeti da su korisničke varijable definirane samo unutar trenutne sesije. Nakon zatvaranja konzole ili završetka skripte, one se brišu.

Sistemske varijable

Osim korisnički deklariranih, postoje ugrađene (sustavne) varijable koje se ne brišu nakon završetka trenutne sesije. Dijele se na dva tipa, pri čemu se podaci o stanju PowerShella pohranjuju u automatske varijable kojima se ne mogu samostalno dodijeliti proizvoljne vrijednosti. Među njima je, na primjer, $PWD:

$PWD.Path

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

Za pohranu korisničkih postavki potrebne su varijable preferencija, čije se vrijednosti mogu mijenjati. Na primjer, pomoću $ErrorActionPreference određuje se reakcija tumača naredbi na pojavu nekritičnih pogrešaka.

Osim operatora i cmdlet-a za pristup definiranim varijablama, postoji i pseudo-repozitorij Variable:. Raditi s njim može se na sličan način kao i s drugim repozitorijima, a varijable u ovom slučaju podsjećaju na objekte datotečnog sustava:

Get-ChildItem Variable: | more

ili

ls Variable: | more

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

Područja vidljivosti

Za varijable u PowerShell-u postoji pojam domena vidljivosti (Scope). Djelovanje globalnog opsega (Global) proteže se na cijelu trenutačnu sesiju — uključuje, na primjer, sistemske varijable. Lokalnim (Local) varijablama može se pristupiti samo unutar opsega u kojem su definirane: recimo unutar funkcije. Postoji i pojam domene skripte (Script), ali za skriptne naredbe ona je u osnovi lokalna. Kada se varijable deklariraju, zadana im je lokalna domena, a za promjenu toga potrebna je posebna konstrukcija u obliku: $Global: varijabla = vrijednost.

Na primjer, ovako:

$Global:test = 100

Varijable okruženja

Iz PowerShell-a postoji još jedan pseudo-repozitorij Env:, putem kojeg se može pristupiti varijablama okoliša. Kada se pokrene ljuska, ona se kopira iz roditeljskog procesa (tj. iz programa koji je inicirao trenutnu sesiju) i obično su njihovi prvotni vrijednosti jednake onima u upravljačkoj ploči. Za prikaz varijabli okoliša koristi se cmdlet Get-ChildItem ili njegovi psevdonimi (aliasi): ls i dir.

dir Env:

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

Ove varijable predstavljaju nizove bajtova (ili znakova, ako želite), čija interpretacija ovisi isključivo o programu koji ih koristi. Cmdleti *-Variable ne rade s varijablama okoliša. Da biste im pristupili, morat ćete koristiti disk prefix:

$env:TEST = "Hello, World!"

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

Aritmetički operatori i operatori usporedbe

U PowerShellu se nalaze sljedeći aritmetički operatori: + (zbrajanje), — (oduzimanje), * (množenje), / (dijeljenje) i % (modul ili ostatak dijeljenja). Rezultat aritmetičkog izraza izračunava se s lijeva na desno u skladu s općim redoslijedom operacija, a za grupiranje dijelova izraza koriste se okrugle zagrade. Razmaci između operatora se zanemaruju, koriste se samo za lakše razumijevanje. Operator + također spaja nizove, a operator * ponavlja nizove. Kada pokušate dodati broj nizu, on će se pretvoriti u niz. Osim toga, u jeziku PowerShell postoji mnoštvo operatora usporedbe koji provjeravaju podudarnost između dviju vrijednosti i vraćaju logičke True ili False:

Operator

Opis

Primer koda

-eq

Jednako / Ravno (analogno = ili == u drugim jezicima)

$test = 100
$test -eq 123 

-ne

Nije jednako / Ne jednako (analogno ili !=)

$test = 100
$test -ne 123   

-gt

Veće od / Veće (analogno >)

$test = 100
$test -gt 123

-ge

Veće ili jednako / Veće ili jednako (analogno >=)

$test = 100
$test -ge 123

-lt

Manje od / Manje (analogno <)

$test = 100
$test -lt 123  

-le

Manje ili jednako / Manje ili jednako (analogno <=)

$test = 100
$test -le 123

Postoje i drugi slični operatori koji omogućuju, na primjer, usporedbu nizova uzimajući u obzir zamjenske znakove ili korištenje regularnih izraza za pretraživanje podudaranja s uzorkom. Njih ćemo detaljno obraditi u sljedećim člancima. Simboli i = za usporedbu se ne koriste, jer su angažirani za druge svrhe.

Operatori dodjeljivanja

Osim najrasprostranjenijeg operatora = postoje i drugi operatori dodjele: +=, -=, *=, /= i %= . Oni mijenjaju vrijednost prije dodijeljivanja. Slično se ponašaju unarni operatori ++ i —, koji povećavaju ili smanjuju vrijednost varijable — oni također pripadaju operatorima dodjele.

Logički operatori

Za opisivanje složenih uvjeta samo usporedba nije dovoljna. Bilo kakve logičke izraze možete zapisati pomoću operatora: -and, -or, -xor, -not i!.. Djeluju kao i u drugim programskim jezicima, pri čemu možete koristiti okrugle zagrade za određivanje redoslijeda izračuna:

("Test" -eq "Test") -and (100 -eq 100)

-not (123 -gt 321) 

!(123 -gt 321)

Uvjetni prijelaz

Operatori grane u PowerShellu su standardni: IF(IF…ELSE, IF…ELSEIF…ELSE) i SWITCH. Razmotrit ćemo njihovu upotrebu na primjerima:

[int]$test = 100
if ($test -eq 100) {
      Write-Host "test = 100"
}



[int]$test = 50
if ($test -eq 100) {
       Write-Host "test = 100"
}
else {
      Write-Host "test >< 100"
}



[int]$test = 10
if ($test -eq 100) {
      Write-Host "test = 100"
}
elseif ($test -gt 100) {
      Write-Host "test > 100"
}
else {
       Write-Host "test < 100"
}



[int]$test = 5
switch ($test) {
     0 {Write-Host "test = 0"}
     1 {Write-Host "test = 1"}
     2 {Write-Host "test = 2"}
     3 {Write-Host "test = 3"}
     4 {Write-Host "test = 4"}
     5 {Write-Host "test = 5"}
     default {Write-Host "test > 5 ili vrijednost nije definirana"}
}

Petlje

U PowerShell jeziku postoji nekoliko vrsta petlji: WHILE, DO WHILE, DO UNTIL, FOR i FOREACH.

Petlja s predikatom radi ako/kada je ona ispravna:

[int]$test = 0
while ($test -lt 10) {
      Write-Host $test
      $test = $test + 1
}

Petlje s post-kondicijom izvršit će se barem jedanput, jer se provjera uvjeta odvija nakon izvršenja iteracije. DO WHILE radi dok je uvjet istinit, a DO UNTIL — dok je lažan:

[int]$test = 0
do {
      Write-Host $test
      $test = $test + 1 
}
while ($test -lt 10)



[int]$test = 0
do {
      Write-Host $test
      $test = $test + 1 
}
until ($test -gt 9)

Broj iteracija FOR petlje unaprijed je poznat:

for ([int]$test = 0; $test -lt 10; $test++) {
       Write-Host $test
}

U FOREACH petlji vrši se iteracija elemenata niza ili kolekcije (hash tablica):

$test_collection = "item1", "item2", "item3"
foreach ($item in $test_collection)
{
        Write-Host $item
}

Nizovi

U PowerShell varijablama se ne čuvaju samo pojedinačni objekti (broj, string itd.), već i višestruki. Najjednostavnija vrsta takvih varijabli su nizovi. Niz može sadržavati nekoliko elemenata, jedan element ili biti prazan, tj. ne sadržavati elemente. Za njegovo deklariranje koristi se operator @(), koji će nam trebati u sljedećem članku — vrlo je važan za dodavanje drugih nizova (stvaranje više dimenzionalnih nizova), prijenos nizova u funkcije kao argument i slične zadatke:

$test_array = @() #creamo prazan niz

Pri inicijalizaciji niza, njegove vrijednosti se navode zarezom (specijalni operator ,):

$test_array = @(1, 2, 3, 4) # kreiramo niz od četiri elementa 

U većini slučajeva operator @() se može izostaviti:

$test_array = 1, 2, 3, 4

U ovom slučaju niz od jednog elementa inicijalizira se na sljedeći način

$test_array = , 1

Za pristup elementima niza koristi se indeks koji počinje od nule i operator indeksa (kvadratne zagrade):

$test_array[0] = 1

Može se navesti više indeksa zarezom, uključujući ponovljene:

$test_array = "jedan", "dva", "tri", "četiri"
$test_array[0,1,2,3]
$test_array[1,1,3,3,0]

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

Operator .. (dvije točke — operator raspona) vraća niz cijelih brojeva unutar određenog gornjeg i donjeg ruba. Na primjer, izraz 1..4 ispisuje niz od četiri elementa @(1, 2, 3, 4), dok izraz 8..5 — niz @(8, 7, 6, 5).

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

Pomoću operatora raspona možete inicijalizirati niz ($test_array = 1..4) ili dobiti rez (slice), tj. sekvencu elemenata jednog niza s indeksima iz drugog. Pri tome negativan broj -1 označava posljednji element niza, -2 — pretposljednji itd.

$test_array = "jedan", "dva", "tri", "četiri"
$test_array[0..2]
$test_array[2..0]
$test_array[-1..0]
$test_array[-2..1]

Obratite pažnju da vrijednosti niza cijelih brojeva mogu biti veće od maksimalne vrijednosti indeksa niza s podacima. U tom slučaju vraćaju se sve vrijednosti do posljednjeg:

$test_array[0..100]

Ako pokušate pristupiti jedinome nepostojećem elementu niza, vraća se vrijednost $null.

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

U PowerShellu, nizovi mogu sadržavati elemente različitih tipova ili biti strogo tipizirani:

$test_array = 1, 2, "test", 3, 4
for ([int]$i = 0; $i -lt $test_array.count; $i++)
{
          Write-Host $test_array[$i]
}

Gdje svojstvo $test_array.count — broj elemenata niza.

Primjer stvaranja strogo tipiziranog niza:

[int[]]$test_array = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Hesh-tabele

Još jedan osnovni tip varijabli u jeziku PowerShell — heš-tablice, koje se također nazivaju asocijativnim nizovima. Hashtablovi su slični JSON objektima i grade se po načelu ključ-vrijednost. Za razliku od običnih nizova, pristup njihovim elementima se vrši po imenovanim ključevima, koji su svojstva objekta (također se može koristiti operator indeksiranja — uglate zagrade).

Prazna heš-tablica se deklarira pomoću službenog simbola @ i operatornih zagrada:

$test_hashtable = @{}

Prilikom deklaracije možete odmah stvoriti ključeve i dodijeliti im vrijednosti:

$test_hashtable = @{one="jedan"; two="dva"; three="tri"; "some key"="some value"}

Za dodavanje elementa u heš-tablicu potrebno je dodijeliti joj još nepostojeći ključ ili iskoristiti metodu Add(). Ako se dodijeli postojeći ključ, njegova vrijednost će se promijeniti. Za brisanje elementa iz heš-tablice koristi se metoda Remove().

$test_hashtable."some key"
$test_hashtable["some key"]
$test_hashtable.Add("four", "četiri")
$test_hashtable.five = "pet"
$test_hashtable['five'] = "zamjenjujemo vrijednost"
$test_hashtable.Remove("one")

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

Promjenjive ovog tipa mogu se prenositi kao argumenti funkcijama i cmdletovima — u sljedećem članku istražit ćemo kako se to radi, kao i razmotriti još jedan sličan tip — PSCustomObject.

Funkcije

U jeziku PowerShell postoje svi potrebni elementi za proceduralno programiranje, uključujući funkcije. Za njihovo opisivanje koristi se ključna riječ Function, nakon koje je potrebno navesti ime funkcije i tijelo unutar zagrade. Ako je potrebno prenijeti argumente u funkciju, mogu se navesti odmah nakon imena u zagradama.

function ime-funkcije (argument1, ..., argumentN) 
{ 
        tijelo-funkcije 
} 

Funkcija uvijek vraća rezultat — to je niz rezultata svih njezinih izjava, ako ih ima više od jednog. Ako je izjava jedna, vraća se jedinstvena vrijednost odgovarajućeg tipa. Konstrukcija return $value dodaje element s vrijednošću $value u niz rezultata i prekida izvršavanje popisa izjava, dok prazna funkcija vraća $null.

Za primjer ćemo stvoriti funkciju koja izdiže broj na kvadrat:

function sqr ($number)
{
      return $number * $number
}

Napominjemo da se unutar tijela funkcije mogu koristiti sve varijable deklarirane prije nego što je funkcija pozvana, a pozivanje funkcija u PowerShellu može izgledati neobično: argumenti (ako ih ima) nisu u zagradama i odvojeni su razmacima.

sqr 2

ili ovako:

sqr -number 2

Zbog načina prijenosa argumenata, samu funkciju ponekad treba staviti u zagrade:

function test_func ($n) {}
test_func -eq $null     # funkcija nije pozvana
(test_func) -eq $null   # rezultat izraza — $true

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

Pri opisivanju funkcije mogu se atributima dodijeliti zadane vrijednosti:

function func ($arg = value) {
         #tijelo funkcije
}

Postoji i drugačija sintaksa za opisivanje argumenata funkcije, osim toga parametri se mogu čitati iz cjevovoda — sve će to biti korisno u sljedećem članku kada budemo razmatrali izvozne module i izradu vlastitih cmdletova.

Obrada grešaka

U PowerShell postoji mehanizam Try…Catch…Finally koji omogućava obradu izuzetnih situacija. U blok Try se stavlja kod u kojem može doći do greške, dok se u blok Catch stavlja njen obrtnik. Ako grešaka nije bilo, on se ne izvršava. Blok Finally se izvršava nakon bloka Try bez obzira na to da li je došlo do greške, a blokova Catch može biti više za izuzetke različitih tipova. Sama iznimka se zapisuje u varijablu koja ne zahteva deklaraciju po defaultu ($_) i može se lako izdvojiti. U donjem primjeru implementiramo zaštitu od unosa nekorektne vrijednosti:

try {

        [int]$test = Read-Host "Unesite broj"
        100 / $test

} catch {

         Write-Warning "Nekorektan broj"
         Write-Host $_

}

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

Na ovom mestu završavamo razmatranje osnova programiranja u jeziku PowerShell. U sledećim člancima detaljnije ćemo istražiti rad sa promenljivim različitih tipova, kolekcijama, regularnim izrazima, kreiranjem funkcija, modula i vlastitih cmdleta, kao i objektno-orijentisano programiranje.

Što je Windows PowerShell i čemu služi? Dio 2: uvod u programski jezik

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster