Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Historikisht, shërbimet e linjës së komandës në sistemet Unix janë zhvilluar më mirë sesa në Windows, por me ardhjen e një zgjidhjeje të re, situata ka ndryshuar.

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

PowerShell mund të skriptohet në një gjuhë të interpretuar, me shumë paradigma që ka elemente të programimit klasik procedural, të orientuar nga objekti dhe madje edhe funksional: degëzime të kushtëzuara, unaza, variabla, vargje, tabela hash, klasa, trajtimi i gabimeve, si dhe funksione. cmdlet dhe tubacione . Artikulli i mëparshëm iu kushtua bazave të punës në mjedis, dhe tani ne u ofrojmë lexuesve tanë një libër të vogël referimi për programuesit.

Përmbajtja:

Komente
Variablat dhe llojet e tyre
Variablat e sistemit
Fushëveprimi
Variablat e mjedisit (mjedisi)
Operatorët aritmetikë dhe krahasimi
Operatorët e caktimit
Operatorët logjikë
Kërcim i kushtëzuar
ciklet
vargjeve
Tabelat hash
Funksionet
Gabim gjatë përpunimit

Mund të shkruani kod në çdo redaktues teksti ose duke përdorur një mjedis të integruar zhvillimi - mënyra më e lehtë është të merrni Windows PowerShell ISE që vjen me sistemet operative të serverit Microsoft. Kjo është e nevojshme vetëm për skriptet mjaft komplekse: grupe të shkurtra komandash janë më të lehta për t'u ekzekutuar në mënyrë interaktive.

Komente

Përdorimi i komenteve konsiderohet pjesë e stilit të mirë të programimit së bashku me dhëmbëzimin dhe hapësirën e duhur:

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

<# 

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

#>

Variablat dhe llojet e tyre

Variablat në PowerShell quhen objekte. Emrat e tyre mund të përfshijnë karakterin nënvizor, si dhe shkronja dhe numra. Simboli $ përdoret gjithmonë përpara emrit, dhe për të deklaruar një variabël, mjafton t'i jepni interpretuesit një emër të vlefshëm:

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Për të inicializuar një ndryshore (caktoni një vlerë për të), përdoret operatori i caktimit (simboli =):

$test = 100

Ju mund të deklaroni një ndryshore duke specifikuar llojin e saj në kllapa katrore (lloji i operatorit casting) përpara emrit ose vlerës:

[int]$test = 100

$test = [int]100

Është e rëndësishme të kuptohet se variablat në PowerShell janë objekte (klasa) të plota me veti dhe metoda, llojet e të cilave bazohen në ato në .NET Core. Ne rendisim ato kryesore:

Lloji (klasa .NET)

Përshkrim

Shembull kodi

[string] System.String

Varg Unicode 

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

[char]Sistemi.Kar

Karakteri Unicode (16 bit)

[char]$test = 'c'

[bool] Sistemi.Boolean

lloji boolean (e vërtetë ose e gabuar)

[bool]$test = $e vërtetë

[int] System.Int32

numër i plotë tridhjetë e dy bit (32 bit)

[int]$test = 123456789

[i gjatë] System.Int64

numër i plotë gjashtëdhjetë e katër bit (64 bit)

[i gjatë]$test = 12345678910

[single] System.Single

numri i pikës lundruese 32 bit i gjatë

[single]$test = 12345.6789

[dyfish]Sistemi.Dyfish

numri i pikës lundruese me gjatësi 64 bit (8 bajt)

[dyfish]$test = 123456789.101112

[decimal]Sistemi.Decimal

Numri i pikës lundruese 128-bit (kërkohet të përfundojë me d)

[decimal]$test = 12345.6789d

[DateTime]Sistemi.DateTime

Data dhe ora 

$test = GetDate

[array] System.Objekt[]

një grup, indeksi i elementit të të cilit fillon me 0

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

[hashtable] System.Collections.Hashtable

tabelat hash janë vargje shoqëruese me çelësa të emërtuar, të ndërtuara sipas parimit: @{key = "vlera"}

$test_hashtable = @{one="një"; dy = "dy"; tre "tre"}

PowerShell mbështet konvertimin e nënkuptuar të llojit, përveç kësaj, lloji i një ndryshoreje mund të ndryshohet menjëherë (për shembull, duke përdorur një operator caktimi), nëse nuk specifikohet me forcë - në këtë rast, përkthyesi do të japë një gabim. Ju mund të përcaktoni llojin e ndryshores nga shembulli i mëparshëm duke thirrur metodën GetType():

$test.GetType().FullName

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Ka një numër cmdlet-sh për manipulimin e variablave. Lista e tyre në një formë të përshtatshme shfaqet duke përdorur komandën:

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

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Për të parë variablat e deklaruar dhe vlerat e tyre, mund të përdorni një cmdlet të veçantë:

Get-Variable | more

Kjo metodë duket tepër e rëndë, është shumë më e përshtatshme për të punuar me variabla përmes operatorëve ose duke iu qasur drejtpërdrejt pronave dhe metodave të tyre. Megjithatë, cmdlet kanë të drejtë të ekzistojnë sepse ju lejojnë të vendosni disa parametra shtesë. Është e rëndësishme të kuptohet se variablat e përdoruesit përcaktohen vetëm brenda sesionit aktual. Kur tastiera mbyllet ose skripti përfundon, ato fshihen.

Variablat e sistemit

Përveç atyre të deklaruara nga përdoruesi, ka variabla të integruar (sistemi) që nuk fshihen pas përfundimit të sesionit aktual. Ato ndahen në dy lloje, ndërsa të dhënat e gjendjes PowerShell ruhen në variabla automatike që nuk mund të caktohen më vete vlera arbitrare. Këto përfshijnë, për shembull, $PWD:

$PWD.Path

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Variablat e preferencës nevojiten për të ruajtur preferencat e përdoruesve, vlerat e të cilave mund të ndryshohen. Për shembull, duke përdorur $ErrorActionPreference , vendoset reagimi i interpretuesit të komandës ndaj shfaqjes së gabimeve jo fatale.

Përveç operatorëve dhe cmdlet-ve për qasje në variablat e deklaruara, ekziston një Variable: pseudo-akumulator. Ju mund të punoni me të në analogji me disqet e tjerë, dhe variablat në këtë rast ngjajnë me objektet e sistemit të skedarëve:

Get-ChildItem Variable: | more

ose

ls Variable: | more

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Fushëveprimi

Për variablat në PowerShell, ekziston koncepti i fushëveprimit (Scope). Veprimi i shtrirjes globale (Global) zbatohet për të gjithë sesionin aktual - ai përfshin, për shembull, variabla të sistemit. Variablat lokalë (lokalë) janë të disponueshëm vetëm në shtrirjen ku janë përcaktuar: të themi brenda një funksioni. Ekziston edhe koncepti i shtrirjes së skriptit (Script), por për komandat e skriptit, ai është në thelb lokal. Si parazgjedhje, kur deklarohen variablat, atyre u jepet një shtrirje lokale, dhe për ta ndryshuar këtë, ju nevojitet një konstrukt i veçantë si: $Global: ndryshore = vlerë.

Për shembull, si kjo:

$Global:test = 100

Variablat e mjedisit (mjedisi)

Një tjetër pseudo-disk, Env:, është i disponueshëm nga PowerShell dhe mund të përdoret për të hyrë në variablat e mjedisit. Kur fillon shell, ato kopjohen nga procesi prind (d.m.th., nga programi që nisi seancën aktuale) dhe zakonisht vlerat e tyre fillestare janë të njëjta me vlerat në panelin e kontrollit. Për të parë variablat e mjedisit, përdorni cmdlet Get-ChildItem ose pseudonimet e tij (aliases): ls dhe dir.

dir Env:

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Këto variabla janë sekuenca bajtësh (ose karaktere, nëse dëshironi), interpretimi i të cilave varet vetëm nga programi që i përdor ato. cmdlet-et *-Variable nuk funksionojnë me variablat e mjedisit. Për të hyrë në to, duhet të përdorni prefiksin e diskut:

$env:TEST = "Hello, World!"

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Operatorët aritmetikë dhe krahasimi

PowerShell ofron operatorët aritmetikë të mëposhtëm: + (mbledhje), - (zbritje), * (shumëzuar), / (pjestim) dhe % (modulo ose modul). Rezultati i një shprehje aritmetike vlerësohet nga e majta në të djathtë në përputhje me rendin e pranuar përgjithësisht të veprimeve, dhe kllapat përdoren për të grupuar pjesë të shprehjes. Hapësirat midis operatorëve nuk merren parasysh, ato përdoren vetëm për ta bërë më të lehtë leximin. Operatori + gjithashtu bashkohet, dhe operatori * përsërit vargjet. Nëse përpiqeni të shtoni një numër në një varg, ai do të konvertohet në një varg. Për më tepër, gjuha PowerShell ka shumë operatorë krahasimi që kontrollojnë për një përputhje midis dy vlerave dhe kthejnë logjikën True ose False:

Operator

Përshkrim

Shembull kodi

-eq

E barabartë / E barabartë (e ngjashme me = ose == në gjuhë të tjera)

Testi $ = 100
$test -eq 123 

- eshte

Jo i barabartë / Jo i barabartë (i ngjashëm me <> ose !=)

Testi $ = 100
$test -ne 123   

-gt

Më e madhe se / Më shumë (analog>)

Testi $ = 100
$test -gt 123

-moshë

Më i madh se ose i barabartë / Më i madh se ose i barabartë (i ngjashëm me >=)

Testi $ = 100
$test -ge 123

-lt

Më pak se / më pak (i ​​ngjashëm me <)

Testi $ = 100
$test -lt 123  

-te

Më pak se ose e barabartë / Më pak se ose e barabartë (e ngjashme me <=)

Testi $ = 100
$test -le 123

Ka operatorë të tjerë të ngjashëm që ju lejojnë, për shembull, të krahasoni vargjet bazuar në një shkronja të egër ose të përdorni shprehje të rregullta për të përputhur një model. Ne do t'i trajtojmë ato në detaje në artikujt e ardhshëm. Simbolet <, > dhe = nuk përdoren për krahasim sepse përdoren për qëllime të tjera.

Operatorët e caktimit

Përveç operatorit më të zakonshëm =, ekzistojnë edhe operatorë të tjerë të caktimit: +=, -=, *=, /= dhe %=. Ata ndryshojnë vlerën para caktimit. Operatorët unarë ++ dhe -, të cilët rrisin ose ulin vlerën e një ndryshoreje, sillen në mënyrë të ngjashme - ata gjithashtu zbatohen për operatorët e caktimit.

Operatorët logjikë

Vetëm krahasimi nuk mjafton për të përshkruar kushtet komplekse. Ju mund të shkruani çdo shprehje logjike duke përdorur operatorët: -and, -or, -xor, -not dhe! .. Ata funksionojnë si në gjuhët e tjera programuese, ndërsa mund të përdorni kllapa për të specifikuar rendin e vlerësimit:

("Тест" -eq "Тест") -and (100 -eq 100)

-not (123 -gt 321) 

!(123 -gt 321)

Kërcim i kushtëzuar

Operatorët e degëve në PowerShell janë standardë: IF (IF…ELSE, IF…ELSEIF…ELSE) dhe SWITCH. Le të shohim përdorimin e tyre me shembuj:

[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 или значение не определено"}
}

ciklet

PowerShell ka disa lloje sythesh: WHILE, DO WHILE, DO DERI, FOR dhe FOREACH.

Një lak me një parakusht funksionon nëse/për aq kohë sa është e vërtetë:

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

Sythet me një kusht postar do të ekzekutohen të paktën një herë, sepse gjendja kontrollohet pas përsëritjes. Në të njëjtën kohë, DO WHILE funksionon ndërsa kushti është i vërtetë dhe DO DERI punon ndërsa është false:

[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)

Numri i përsëritjeve të ciklit FOR dihet paraprakisht:

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

Në ciklin FOREACH, përsëritet mbi elementët e një grupi ose koleksioni (tabelë hash):

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

vargjeve

Variablat PowerShell ruajnë jo vetëm objekte të vetme (numër, varg, etj.), por edhe disa objekte. Lloji më i thjeshtë i variablave të tillë janë vargje. Një grup mund të përbëhet nga disa elementë, një element, ose të jetë bosh, d.m.th. nuk përmbajnë elemente. Është deklaruar duke përdorur operatorin @(), i cili do të na nevojitet në artikullin tjetër - është shumë e rëndësishme për shtimin e vargjeve të tjera në një grup (krijimi i vargjeve shumëdimensionale), kalimi i vargjeve në funksionet si argument dhe detyra të ngjashme:

$test_array = @() #создаем пустой массив

Kur një grup inicializohet, vlerat e tij renditen të ndara me presje (operatori special ,):

$test_array = @(1, 2, 3, 4) # создаем массив из четырех элементов 

Në shumicën e rasteve, operatori @() mund të hiqet:

$test_array = 1, 2, 3, 4

Në këtë rast, një grup me një element inicializohet si më poshtë

$test_array = , 1

Elementet e grupit arrihen duke përdorur një indeks të numrit të plotë me bazë zero dhe operatorin e indeksit (kllapa katrore):

$test_array[0] = 1

Ju mund të specifikoni disa indekse të ndara me presje, përfshirë. të përsëritura:

$test_array = "один", "два", "три", "четыре"
$test_array[0,1,2,3]
$test_array[1,1,3,3,0]

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Operator .. (dy pika - operatori i diapazonit) kthen një grup numrash të plotë brenda kufijve të sipërm dhe të poshtëm të specifikuar. Për shembull, shprehja 1..4 nxjerr një grup prej katër elementësh @(1, 2, 3, 4), dhe shprehja 8..5 nxjerr një grup @(8, 7, 6, 5).

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Duke përdorur operatorin e diapazonit, mund të inicializoni një grup ($test_array = 1..4) ose të merrni një pjesë (slice), d.m.th. një sekuencë elementësh nga një grup me indekse nga një tjetër. Në këtë rast, një numër negativ -1 tregon elementin e fundit të grupit, -2 - atë të parafundit, e kështu me radhë.

$test_array = "один", "два", "три", "четыре"
$test_array[0..2]
$test_array[2..0]
$test_array[-1..0]
$test_array[-2..1]

Vini re se vlerat e grupit të numrave të plotë mund të jenë më të mëdha se vlera maksimale e indeksit të grupit të të dhënave. Në këtë rast, të gjitha vlerat kthehen deri në të fundit:

$test_array[0..100]

Nëse përpiqeni të aksesoni një element të vetëm të grupit jo-ekzistent, $null kthehet.

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Në PowerShell, vargjet mund të përmbajnë elementë të llojeve të ndryshme ose të shtypen fort:

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

Ku vetia $test_array.count është numri i elementeve të grupit.

Një shembull i krijimit të një grupi të shtypur fort:

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

Tabelat hash

Një lloj tjetër bazë variablash në gjuhën PowerShell janë tabelat hash, të njohura gjithashtu si vargje asociative. Hashtablet janë të ngjashëm me objektet JSON dhe janë ndërtuar mbi bazën e vlerës së çelësit. Ndryshe nga grupet e zakonshme, elementët e tyre aksesohen me çelësa të emërtuar, të cilët janë veti të objektit (mund të përdorni edhe operatorin e indeksit - kllapa katrore).

Një tabelë e zbrazët hash deklarohet duke përdorur simbolin @ dhe kllapat e operatorit:

$test_hashtable = @{}

Kur deklaroni, mund të krijoni menjëherë çelësa dhe t'u caktoni atyre vlera:

$test_hashtable = @{one="один"; two="два"; three="три"; "some key"="some value"}

Për të shtuar një element në një tabelë hash, duhet të caktoni një çelës që nuk ekziston ende në të, ose të përdorni metodën Shto (). Nëse i bëhet një caktim një çelësi ekzistues, vlera e tij do të ndryshojë. Metoda Remove() përdoret për të hequr një element nga një tabelë hash.

$test_hashtable."some key"
$test_hashtable["some key"]
$test_hashtable.Add("four", "четыре")
$test_hashtable.five = "пять"
$test_hashtable['five'] = "заменяем значение"
$test_hashtable.Remove("one")

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Variablat e këtij lloji mund të kalohen si argumente në funksione dhe cmdlet - në artikullin tjetër do të studiojmë se si bëhet kjo, dhe gjithashtu do të shqyrtojmë një lloj tjetër të ngjashëm - PSCustomObject.

Funksionet

PowerShell ka gjithçka që ju nevojitet për programimin procedural, duke përfshirë funksionet. Për t'i përshkruar ato, përdoret fjala e funksionit Funksion, pas së cilës duhet të specifikoni emrin e funksionit dhe trupin e mbyllur në kllapat e operatorit. Nëse ju duhet të kaloni argumente në funksion, mund t'i specifikoni ato menjëherë pas emrit në kllapa.

function имя-функции (аргумент1, ..., аргументN) 
{ 
        тело-функции 
} 

Funksioni kthen gjithmonë një rezultat - është një grup i rezultateve të të gjitha deklaratave të tij, nëse ka më shumë se një. Nëse ka vetëm një deklaratë, kthehet vlera e vetme e llojit përkatës. Konstruksioni i kthyeshëm $value shton një element me vlerën $value në grupin e rezultateve dhe anulon ekzekutimin e listës së deklaratave dhe funksioni bosh kthen $null.

Për shembull, le të krijojmë një funksion për katrorin e një numri:

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

Vini re se në trupin e një funksioni, mund të përdorni çdo ndryshore të deklaruar përpara se ta thërrisni atë, dhe thirrja e funksioneve në PowerShell mund të duket e pazakontë: argumentet (nëse ka) nuk janë të mbyllura në kllapa dhe janë të ndara me hapësira.

sqr 2

ose kështu:

sqr -number 2

Për shkak të mënyrës se si kalohen argumentet, vetë funksioni ndonjëherë duhet të mbyllet në kllapa:

function test_func ($n) {}
test_func -eq $null     # функция не вызывалась
(test_func) -eq $null   # результат выражения — $true

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Kur përshkruani një funksion, mund t'u caktoni vlerat e paracaktuara argumenteve:

function func ($arg = value) {
         #тело функции
}

Ekziston një sintaksë tjetër për përshkrimin e argumenteve të funksionit, përveç kësaj, parametrat mund të lexohen nga tubacioni - e gjithë kjo do të jetë e dobishme në artikullin tjetër, kur shikojmë modulet e eksportuara dhe krijojmë cmdlet-et tona.

Gabim gjatë përpunimit

PowerShell ka një mekanizëm Try...Catch...Më në fund për të trajtuar përjashtimet. Blloku Try përmban kodin në të cilin mund të ndodhë një gabim dhe blloku Catch përmban mbajtësin e tij. Nëse nuk ka pasur gabim, ai nuk ekzekutohet. Blloku Përfundimisht ekzekutohet pas bllokut Try, pavarësisht nga shfaqja e një gabimi, dhe mund të ketë disa blloqe Catch për lloje të ndryshme përjashtimesh. Vetë përjashtimi është shkruar në një variabël të paracaktuar të padeklaruar ($_) dhe mund të merret lehtësisht. Në shembullin e mëposhtëm, ne zbatojmë mbrojtje kundër futjes së një vlere të pavlefshme:

try {

        [int]$test = Read-Host "Введите число"
        100 / $test

} catch {

         Write-Warning "Некорректное число"
         Write-Host $_

}

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Kjo përfundon rishikimin e bazave të programimit në gjuhën PowerShell. Në artikujt e mëposhtëm, do të studiojmë më në detaje punën me variabla të llojeve të ndryshme, koleksione, shprehje të rregullta, krijimin e funksioneve, moduleve dhe cmdlet-ve të personalizuara, si dhe programimin e orientuar drejt objekteve.

Çfarë është Windows PowerShell dhe me çfarë hahet? Pjesa 2: Hyrje në gjuhën e programimit

Burimi: www.habr.com

Shto një koment