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.
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 .
Përmbajtja:
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:
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.StringVarg Unicode
$test = "test"
$test = 'test'
Karakteri Unicode (16 bit)
[char]$test = 'c' [bool] Sistemi.Booleanlloji boolean (e vërtetë ose e gabuar)
[bool]$test = $e vërtetë [int] System.Int32numër i plotë tridhjetë e dy bit (32 bit)
[int]$test = 123456789 [i gjatë] System.Int64numër i plotë gjashtëdhjetë e katër bit (64 bit)
[i gjatë]$test = 12345678910 [single] System.Singlenumri i pikës lundruese 32 bit i gjatë
[single]$test = 12345.6789 [dyfish]Sistemi.Dyfishnumri i pikës lundruese me gjatësi 64 bit (8 bajt)
[dyfish]$test = 123456789.101112 [decimal]Sistemi.DecimalNumri i pikës lundruese 128-bit (kërkohet të përfundojë me d)
[decimal]$test = 12345.6789d [DateTime]Sistemi.DateTimeData 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.Hashtabletabelat 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
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
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
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
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:
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!"
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]
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).
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.
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")
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
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 $_
}
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.
Burimi: www.habr.com