Historikisht, utilitat e komandës në sistemet Unix janë zhvilluar më mirë se në Windows, megjithatë, me shfaqjen e zgjidhjeve të reja, situata ka ndryshuar.
Për PowerShell, mund të shkruani skenarë në një gjuhë interpretuese shumëparadigmore, e cila ka elemente të programimit procedurial klasik, programimit objektor dhe madje edhe atij funksional: kalime kushtore, cikle, variabla, array, tabela me shpërndarje, klasa, trajtimi i gabimeve, si dhe funksione, cmdlet dhe tubacione. ishte përkushtuar bazave të punës në mjedis, dhe tani ne ofrojmë për lexuesit një udhëzues të vogël për programuesit.
Përmbajtje:
Mund të shkruani kod në çdo editor teksti ose duke përdorur një ambient të integruar zhvillimi — më e lehtë është të merrni Windows PowerShell ISE nga paketa e sistemeve operative server të Microsoft. Kjo është e nevojshme vetëm për skenarët mjaft të komplikuar: grupe të shkurtra komandash janë më të thjeshta për t'u ekzekutuar në modin interaktiv.
Komentet
Përdorimi i komenteve konsiderohet pjesë e stilit të mirë të programimit së bashku me hapësirat dhe indentimet e duhura:
# Для строчных комментариев используется символ решетки — содержимое строки интерпретатор не обрабатывает.
<#
Так обозначаются начало и конец блочного комментария.
Заключенный между ними текст интерпретатор игнорирует.
#>
Variablat dhe tipet e tyre
Variablat në PowerShell — janë objekte të emërtuara. Emrat e tyre mund të përfshijnë simbolin e nënvizimit, si dhe shkronjat dhe numrat. Para emrit gjithmonë përdoret simboli $, dhe për të shpallur një variabël, mjafton t'i tregoni interpretuest të emrin e lejuar:

Për të inicializuar një variabël (për t'i caktuar asaj një vlerë), përdoret operatori i caktimit (simboli =):
$test = 100Një variabël mund të shpallet me specifikimin e tipit të saj në katrorët e hapur (operatori i konvertimit të tipit) para emrit ose vlerës:
[int]$test = 100
$test = [int]100Është e rëndësishme të kuptoni se variablat në PowerShell — janë objekte të plota (klasa) me pronat dhe metodat e tyre, të cilat janë të bazuara në ato që ka në .NET Core. Le t'i rendisim ata kryesorë:
Tipi (klasa .NET)
Përshkrimi
Shembulli i kodit
[string]
System.String
string Unicode
$test = «test»
$test = ‘test’
[char]
System.Char
simbol Unicode (16 bit)
[char]$test = ‘c’
[bool]
System.Boolean
tipi boolean (vlera logjike True ose False)
[bool]$test = $true
[int]
System.Int32
numër i plotë me 32-bitë
[int]$test = 123456789
[long]
System.Int64
numër i plotë me 64-bitë
[long]$test = 12345678910
[single]
System.Single
numër me pikë lëvizëse me gjatësi 32-bitë
[single]$test = 12345.6789
[double]
System.Double
numri me presje floating me gjatësi 64 bit (8 byte)
[double]$test = 123456789.101112
[decimal]
System.Decimal
numri me presje floating me gjatësi 128 bit (duhet të jepet d në fund)
[decimal]$test = 12345.6789d
[DateTime]
System.DateTime
data dhe koha
$test = Get-Date
[array]
System.Object[]
në array, indeksi i elementeve fillon nga 0
$test_array = 1, 2, "test", 3, 4
[hashtable]
System.Collections.Hashtable
hash tables — array asocative me çelësa me emra, të ndërtuar sipas parimit: @{çelësi = "vlera"}
$test_hashtable = @{one="një"; two="dy"; three="tre"}
PowerShell mbështet konvertimin implicit të tipeve, përveç kësaj tipi i variablit mund të ndryshojë në lëvizje (për shembull, përmes operatorit të caktimit), nëse nuk është specifikuar për forcë — në këtë rast interpretuese do të japë një gabim. Të përcaktojmë tipin e variablit nga shembulli i mëparshëm mund të bëhet përmes thirrjes së metodës GetType():
$test.GetType().FullName 
Ekziston një numër komandletesh për menaxhimin e variablave. Lista e tyre shfaqet në një formë të përshtatshme përmes komandës:
Get-Command -Noun Variable | ft -Property Name, Definition -AutoSize -Wrap 
Për të parë variablat e shpallura dhe vlerat e tyre mund të përdorni një komandlet të veçantë:
Get-Variable | moreKy mënyrë duket tepër e ngarkuar, me variablat eshtë shumë më e lehtë të punosh përmes operatorëve ose duke u drejtuar direkt në pronat dhe metodat e tyre. Megjithatë, komandlet kanë të drejtën për të ekzistuar, pasi lejojnë për të përcaktuar disa parametra shtesë. E rëndësishme është që variablat përdorues janë të përcaktuar vetëm brenda seancës aktuale. Pas mbylljes së konsolës ose përfundimit të skenarit, ato fshihen.
Variablat sistemore
Përveç variablave të shpallura nga përdoruesi, ekzistojnë variablat e integruar (sistemi), të cilat nuk fshihen pas përfundimit të seancës aktuale. Ato ndahen në dy lloje, ndërsa të dhënat e gjendjes së PowerShell ruhen në variablat automatikë, të cilëve nuk mund t'u caktohen vlera arbitrare. Njëra prej tyre është, për shembull, $PWD:
$PWD.Path 
Për të ruajtur preferencat e përdoruesit nevojiten variablat e preferencave, vlerat e të cilëve mund të ndryshohen. Për shembull, përmes $ErrorActionPreference përcaktohet reagimi i interpretuese ndaj ndodhisë së gabimeve jo kritike.
Përveç operatorëve dhe komandave për të qasur variablat e shpallur, ekziston një pseudo-ruajtës Variable:. Mund të punohet me të njëjtë si me ruajtësit e tjerë, dhe variablat në këtë rast i ngjajnë objekteve të sistemit të skedarëve:
Get-ChildItem Variable: | moreose
ls Variable: | more 
Fushat e pamjes
Për variablat në PowerShell ka një koncept të fushës së aplikimit (Scope). Veprimi i fushës globale (Global) shtrihet në të gjithë seancën aktuale — përfshin, për shembull, variablat sistemorë. Variablat lokale (Local) janë të aksesueshme vetëm në fushën ku janë përcaktuar: për shembull brenda një funksioni. Ekziston gjithashtu një koncept i fushës së skenarit (Script), por për komandat e skenarit ajo në thelb është lokale. Në mënyrë të paracaktuar, kur shpallen variablat, ata i jepet një fushë lokale, dhe për ta ndryshuar këtë, nevojitet një konstrukcion i veçantë si: $Global: variabli = vlera.
Për shembull, kështu:
$Global:test = 100
Variablat e mjedisit
Nga PowerShell është gjithashtu në dispozicion një pseudo-ruajtës tjetër Env:, me të cilin mund të qasemi ndaj variablave të mjedisit. Kur fillohet shell, ato kopjohen nga procesi prind (dmth. nga programi që iniciativet seancën aktuale) dhe zakonisht vlerat e tyre fillestare përputhen me vlerat në panelin e kontrollit. Për të parë variablat e mjedisit përdoret komandleti Get-ChildItem ose pseudonimet e tij (aliaset): ls dhe dir.
dir Env: 
Këto variabla përfaqësojnë sekuenca bajtësh (ose karakteresh, nëse dëshironi), interpretimi i të cilave varet vetëm nga programa që i përdor. Komandlet *-Variable nuk funksionojnë me variablat e mjedisit. Për t'u qasur atyre, do t'ju duhet të përdorni prefiksin e disku:
$env:TEST = "Hello, World!" 
Operatorët aritmetikë dhe operatorët e krahasimit
Në PowerShell ka operatorë aritmetikë të tillë: + (shtim), - (zbritje), * (shumëzim), / (ndarje) dhe % (moduli ose mbetja nga ndarja). Rezultati i shprehjes aritmetike llogaritet nga majta në të djathtë në përputhje me rendin e zakonshëm të operatorëve, dhe për grupimin e pjesëve të shprehjes përdoren kllapat. Hapsirat midis operatorëve injorohen, ato përdoren vetëm për të lehtësuar perceptimin. Operatorët + gjithashtu bashkojnë, ndërsa operatori * përsëritë rreshtat. Kur përpiqeni të shtoni një numër në një rresht, ai do të konvertohet në rresht. Për më tepër, në gjuhën PowerShell ka shumë operatorë krahasimi që kontrollojnë përputhshmërinë midis dy vlerave dhe kthejnë logjike True ose False:
Operatori
Përshkrimi
Shembulli i kodit
-eq
Barazim / E barabartë (analog me = ose == në gjuhë të tjera)
$test = 100
$test -eq 123
-ne
Jo barazim / Nuk është e barabartë (analog me ose !=)
$test = 100
$test -ne 123
-gt
Më e madhe / Më e madhe (analog me >)
$test = 100
$test -gt 123
-ge
Më e madhe ose e barabartë / Më e madhe ose e barabartë (analog me >=)
$test = 100
$test -ge 123
-lt
Më e vogël / Më e vogël (analog me <)
$test = 100
$test -lt 123
-le
Më e vogël ose e barabartë / Më e vogël ose e barabartë (analog me <=)
$test = 100
$test -le 123
Ka edhe operatorë të tjerë të ngjashëm që lejojnë, për shembull, krahasimin e rreshtave me konsideratë për simbolet e zëvendësimit ose përdorimin e shprehjeve të rregullta për të kërkuar përputhje me një model. Këta do t'i shqyrtojmë në artikujt e ardhshëm. Simbolet dhe = për krahasim nuk përdoren, sepse janë angazhuar për qëllime të tjera.
Operatorët e caktimit
Përveç operatorit më të zakonshëm = ka edhe operatorë të tjerë të caktimit: +=, -=, *=, /= dhe %= . Ata ndryshojnë vlerën para caktimit. Po ashtu, operatorët unar ++ dhe --, të cilët rrisin ose zvogëlojnë vlerën e variablit, gjithashtu klasifikohen si operatorë të caktimit.
Operatorët logjikë
Për të përshkruar kushte të ndërlikuara, vetëm krahasimi nuk është i mjaftueshëm. Çdo shprehje logjike mund të shkruhet duke përdorur operatorët: -and, -or, -xor, -not dhe!.. Ata funksionojnë si në gjuhë të tjera programimi, dhe gjithashtu mund të përdoren kllapat për të caktuar rendin e llogaritjes:
("Test" -eq "Test") -and (100 -eq 100)
-not (123 -gt 321)
!(123 -gt 321)
Kalimi kushtor
Operatorët e ndarjes në PowerShell janë standardë: IF(IF…ELSE, IF…ELSEIF…ELSE) dhe SWITCH. Do të shqyrtojmë 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 5 ose vlera nuk është e përcaktuar"}
}
Ciklet
Gjuha PowerShell ka disa lloje ciklesh: WHILE, DO WHILE, DO UNTIL, FOR dhe FOREACH.
Cikli me kusht paraprak funksionon, kur/derisa ai është i vërtetë:
[int]$test = 0
while ($test -lt 10) {
Write-Host $test
$test = $test + 1
}
Ciklet me kusht të pasmë do të ekzekutohen të paktën një herë, sepse kontrollimi i kushtit bëhet pas përfundimit të iteracionit. Këtu, DO WHILE funksionon derisa kushti të jetë i vërtetë, ndërsa DO UNTIL — derisa ai të jetë i gabuar:
[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 iteracioneve në ciklin FOR është i njohur paraprakisht:
for ([int]$test = 0; $test -lt 10; $test++) {
Write-Host $test
}
Cikli FOREACH realizon kalimin mbi elementet e një vargu ose koleksioni (tabellash hash):
$test_collection = "item1", "item2", "item3"
foreach ($item in $test_collection)
{
Write-Host $item
}
Array
Në variablat e PowerShell ruhen jo vetëm objekte të vetme (numra, vargje etj.), por edhe shumica. Lloji më i thjeshtë i këtyre variablave — vargjet. Një varg mund të përmbajë disa elemente, një element ose të jetë bosh, pra, pa elemente. Për ta deklaruar përdoret operatori @(), i cili do të na nevojitet në artikullin e ardhshëm — është shumë i rëndësishëm për të shtuar në vargë vargje të tjera (krijimi i vargjeve shumë-dimensionale), kalimin e vargjeve në funksione si argument dhe për detyra të ngjashme:
$test_array = @() # krijojmë një varg boshKur inicializohet vargu, vlerat e tij renditen me një presje (operatori special ,):
$test_array = @(1, 2, 3, 4) # krijojmë një varg me katër elemente Në shumicën e rasteve, operatori @() mund të anashkalohet:
$test_array = 1, 2, 3, 4Në këtë rast, vargu i një elementi inicializohet si më poshtë
$test_array = , 1Për të arritur në elementet e vargut përdoret një indeks të plotë numerik që fillon nga zero dhe operatori i indeksit (kllapat katrore):
$test_array[0] = 1Mund të specifikohen disa indekse me një presje, përfshirë ato që përsëriten:
$test_array = "një", "dy", "tre", "katër"
$test_array[0,1,2,3]
$test_array[1,1,3,3,0] 
Operatori .. (dy katër – operatori i diapazonit) kthen një array të numrave të plotë në një segment me kufij të caktuar sipër dhe poshtë. Për shembull, shprehja 1..4 jep një array me katër elemente @(1, 2, 3, 4), ndërsa shprehja 8..5 – një array @(8, 7, 6, 5).

Me operatorin e diapazonit mund të inicializoni një array ($test_array = 1..4) ose të merrni një pjesë (slice), domethënë një sekuencë elementesh nga një array me indekse nga një tjetër. Në këtë rast, numri negativ -1 përfaqëson elementin e fundit të array-t, -2 – para fundit, dhe kështu me radhë.
$test_array = "një", "dy", "tre", "katër"
$test_array[0..2]
$test_array[2..0]
$test_array[-1..0]
$test_array[-2..1]Vini re se vlerat e array-t të numrave të plotë mund të jenë më të mëdha se vlera maksimale e indeksit të array-t me të dhëna. Në këtë rast, kthehen të gjitha vlerat deri në të fundit:
$test_array[0..100]Nëse tentoni të aksesoni një element të vetëm joekzistues të array-t, kthehet vlera $null.

Në PowerShell, array-t mund të përmbajnë elementë nga tipe të ndryshme ose të jenë të skeduara strikt:
$test_array = 1, 2, "test", 3, 4
for ([int]$i = 0; $i -lt $test_array.count; $i++)
{
Write-Host $test_array[$i]
}
Ku prona $test_array.count është numri i elementeve të array-t.
Shembuj për krijimin e një array-je strikt të skeduar:
[int[]]$test_array = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Tabelat e shpërndarjes
Një tip tjetër bazik i variablave në gjuhën PowerShell janë tabelat hash, të cilat quhen gjithashtu array-t asociativë. Hashtable-t janë të ngjashme me objektet JSON dhe ndërtohen sipas parimit çelës-vlerë. Në krahasim me array-t e zakonshme, aksesimi i elementeve të tyre bëhet me çelësa të emëruar, të cilat janë pasuri të objektit (po ashtu mund të përdoret operatori i indeksit – katrorët).
Një tabelë hash e zbrazët shpallet me simbolin e shërbimit @ dhe skopet operator:
$test_hashtable = @{}Në momentin e shpalljes, mund të krijoni menjëherë çelësa dhe t'u jepni atyre vlera:
$test_hashtable = @{one="një"; two="dy"; three="tre"; "some key"="some value"}Për të shtuar një element në tabelën hash, duhet t'i atribuoni një çelës që nuk ekziston ende ose të përdorni metodën Add(). Nëse atribuimi bëhet me një çelës ekzistues, vlera e tij do të ndryshohet. Për të eliminuar një element nga tabela hash përdoret metoda Remove().
$test_hashtable."some key"
$test_hashtable["some key"]
$test_hashtable.Add("four", "katër")
$test_hashtable.five = "pesë"
$test_hashtable['five'] = "ndrysho vlerën"
$test_hashtable.Remove("one") 
Variablat e këtij tipi mund të kalohen si argumento në funksione dhe komandlet - në artikullin e ardhshëm ne do të shqyrtojmë se si bëhet kjo, si dhe do të shqyrtojmë një tip tjetër të ngjashëm - PSCustomObject.
Funksionet
Në gjuhën PowerShell ka të gjitha elementët e nevojshëm për programimin procedural, përfshirë funksionet. Për ta përshkruar ato përdoret fjala kyçe Function, pas së cilës kërkohet të jepet emri i funksionit dhe trupi i vendosur në kllapa. Nëse është e nevojshme të kaloni argumento në funksion, ato mund të jepen menjëherë pas emrit në kllapa të rrethuar.
function emri-funksionit (argument1, ..., argumentN)
{
trupi-i-funksionit
}
Funksioni gjithmonë kthehet një rezultat - ky është një array i rezultateve të të gjitha deklaratave të tij, nëse ka më shumë se një. Nëse ka një deklaratë vetëm, kthehet një vlerë e vetme e llojit përkatës. Konstrukti return $value shton një element me vlerën $value në array-in e rezultateve dhe ndalon ekzekutimin e listës së deklaratave, ndërsa një funksion i zbrazët kthen $null.
Si shembull, le të krijojmë një funksion për ngritjen e një numri në katror:
function sqr ($number)
{
return $number * $number
}
Vlen të theksohet se në trupin e funksionit mund të përdoren çdo variabla të shpallura para thirrjes së tij, dhe thirrjet e funksioneve në PowerShell mund të duken të pazakonshme: argumentet (nëse ekzistojnë) nuk vendosen në kllapa dhe ndahen me hapësira.
sqr 2ose kështu:
sqr -number 2Për shkak të mënyrës së kalimit të argumenteve, ndonjëherë funksionin duhet ta vendosim në kllapa:
function test_func ($n) {}
test_func -eq $null # funksioni nuk është thirrur
(test_func) -eq $null # rezultati i shprehjes - $true 
Kur përshkruani një funksion, mund t'u caktoni argumento vlera të paracaktuara:
function func ($arg = value) {
#trupi i funksionit
}
Ekziston edhe një sintaksë tjetër për përshkrimin e argumentove të funksionit, përveç kësaj parametrat mund të lexohen nga tubi - të gjitha këto do të jenë të dobishme në artikullin e ardhshëm, kur do të shqyrtojmë modulat e eksportuara dhe krijimin e komandletëve të tanishëm.
Trajtimi i gabimeve
Në PowerShell ekziston një mekanizëm Try…Catch…Finally që lejon trajtimin e situatave përjashtimore. Në bllokun Try vendoset kodi ku mund të ndodhë një gabim, ndërsa në bllokun Catch vendoset trajtuesi i tij. Nëse nuk kishte gabim, ky bllok nuk ekzekutohet. Blloku Finally ekzekutohet pas bllokut Try, pavarësisht nga shfaqja e gabimit, dhe mund të ketë disa blloqe Catch për përjashtime të ndryshme. Përjashtimi vetë ruhet në një variabël që nuk kërkon shpallje ($_) dhe mund të nxirret lehtësisht. Në shembullin më poshtë ne realizojmë mbrojtje nga hyrja e një vlerë të gabuar:
try {
[int]$test = Read-Host "Shkruani një numër"
100 / $test
} catch {
Write-Warning "Numër i gabuar"
Write-Host $_
}

Në këtë pikë, shqyrtimi i bazave të programimit në gjuhën PowerShell duhet të përfundojë. Në artikujt e ardhshëm ne do të studiojmë më thellë punën me variablat e llojeve të ndryshme, koleksionet, shprehjet e rregullta, krijimin e funksioneve, moduleve dhe komandave tona, si dhe programimin orientuar në objekte.
Burimi: habr.com
