Historikisht, utilitat e komandave 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ë shkruhen skenarë në një gjuhë interpretuese multikombëshe, e cila ka elemente të programimit procedural tradicional, programimit të orientuar nga objekti dhe madje edhe programimit funksional: kalimet kushtore, ciklet, variablat, tabelat e hash-it, klasat, trajtimi i gabimeve, si dhe funksionet, komandlet dhe tubat. Ishte përkushtuar themeloreve të punës në mjedis, dhe tani ne ofrojmë lexuesve një udhëzues të vogël për programuesit.
Përmbajtja:
Kodet mund të shkruhen në çdo redaktues teksti ose duke përdorur një mjedis zhvillimi të integruar — më e lehtë është të përdorni Windows PowerShell ISE nga paketimi i sistemeve operative të serverëve të Microsoft. Kjo është vetëm e nevojshme për skripte mjaft të ndërlikuara: grupe të shkurtra komandash është më e lehtë të realizohen në mënyrë interaktive.
Komentet
Përdorimi i komenteve konsiderohet një pjesë e stilit të mirë të programimit përveç hapësirave dhe ndarjeve të sakta:
# Для строчных комментариев используется символ решетки — содержимое строки интерпретатор не обрабатывает.
<#
Так обозначаются начало и конец блочного комментария.
Заключенный между ними текст интерпретатор игнорирует.
#>
Variablat dhe tipet e tyre
Variablat në PowerShell janë objekte me emër. 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 tregosh interpretorit një emër të lejueshëm:

Për të inicializuar një variabël (për t'i dhënë asaj një vlerë) përdoret operatori i caktimit (simboli =):
$test = 100Një variabël mund të shpallet duke specifikuar tipin e saj në kllapa katrore (operatori i konvertimit të tipit) para emrit ose vlerës:
[int]$test = 100
$test = [int]100Është e rëndësishme të kuptohet se variablat në PowerShell janë objekte të plota (klasa) me veti dhe metoda, ku tipet janë të bazuara në ato që ekzistojnë në .NET Core. Le të listojmë principalet:
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
numri i plotë i dyzet e dy bitëve (32 bit)
[int]$test = 123456789
[long]
System.Int64
numri i plotë i gjashtëdhjetë e katër bitëve (64 bit)
[long]$test = 12345678910
[single]
System.Single
numri me pikë lundruese me gjatësi 32 bit
[single]$test = 12345.6789
[double]
System.Double
numri me pikë lundruese me gjatësi 64 bit (8 byte)
[double]$test = 123456789.101112
[decimal]
System.Decimal
numri me pikë lundruese me gjatësi 128 bit (duhet të tregohet d në fund)
[decimal]$test = 12345.6789d
[DateTime]
System.DateTime
data dhe koha
$test = Get-Date
[array]
System.Object[]
array, indeksi i elementeve fillon nga 0
$test_array = 1, 2, «test», 3, 4
[hashtable]
System.Collections.Hashtable
tabelat e hash-it — arrays associative me çelë të emëruara të ndërtuara sipas parimit: @{çelësi = «vlera»}
$test_hashtable = @{one=«një»; two=«dy»; three=«tre»}
PowerShell mbështet konvertimin implicit të tipave, për më tepër tipi i variablit mund të ndryshojë në lëvizje (për shembull, përmes operatorit të caktimit), nëse nuk është specifikuar me forcë — në këtë rast interpretrimi do të japë një gabim. Mund të përcaktohet tipi i variablit nga shembulli i mëparshëm përmes thirrjes së metodës GetType():
$test.GetType().FullName 
Ekziston një numër komandletësh për menaxhimin e variablave. Lista e tyre nxirret në një formë të përshtatshme me komandën:
Get-Command -Noun Variable | ft -Property Name, Definition -AutoSize -Wrap 
Për të parë variablat e shpallura dhe vlerat e tyre mund të përdoret komandle specifike:
Get-Variable | moreKy mënyrë duket tepër e ndërlikuar, me variablat është shumë më e lehtë të punohet përmes operatorëve ose duke i thirrur drejtpërdrejt në vetitë dhe metodat e tyre. Megjithatë, komandletët kanë të drejtën për të ekzistuar, pasi lejojnë të caktohen disa parametra të tjerë. Është e rëndësishme të kuptohet se variablat e përdoruesve janë të përcaktuar vetëm brenda seancës aktuale. Pas mbylljes së konsolës ose përfundimit të skenarit, ato fshihen.
Variablat sistemike
Përveç variablave të shpallur nga përdoruesit, ekzistojnë variabla të integruar (sistemikë), të cilat nuk fshihen pas përfundimit të seancës aktuale. Ato ndahen në dy lloje, ndërsa të dhënat mbi gjendjen PowerShell ruhen në variabla automatikë, të cilëve nuk mund t'u caktohen vlera të rastit. Njëra prej tyre është, për shembull, $PWD:
$PWD.Path 
Për ruajtjen e preferencave të përdoruesit kërkohen variabla preferencash, të cilat mund të ndryshohen. Për shembull, me $ErrorActionPreference përcaktohet reagimi i interpreterit të komandave ndaj shfaqjes së gabimeve jo kritike.
Përveç operatorëve dhe komandave për qasjen në variablat e deklaruar, ekziston një pseudo-koleksion Variable:. Mund të punoni me të sipas analogjisë me koleksionet e tjera, ndërsa variablat në këtë rast i ngjajnë objekteve të sistemit të skedarëve:
Get-ChildItem Variable: | moreose
ls Variable: | more 
Fushat e dukshmërisë
Për variablat në PowerShell ekziston koncepti i fushës së ndikimit (Scope). Veprimi i fushës globale (Global) përfshin të gjithë seancën aktuale — përfshin, për shembull, variablat sistemorë. Variablat lokale (Local) janë të aksesueshëm vetëm në fushën ku janë përcaktuar: le të themi brenda një funksioni. Ekziston gjithashtu koncepti i fushës së skenarit (Script), por për komandat e skenarëve ajo në thelb është lokale. Si rregull, kur shpallen variablat, atyre u caktohet fusha lokale, dhe për ta ndryshuar, nevojitet një konstrukcion i veçantë si: $Global: variabla = vlera.
Për shembull, kështu:
$Global:test = 100
Variablat e mjedisit
Nga PowerShell është e aksesueshme gjithashtu një pseudokoleksion tjetër Env:, me të cilin mund të qaseni në variablat e mjedisit. Kur startohet shell-i, ato kopjohen nga procesi prind (dmth. nga programi që ka iniciuar seancën aktuale) dhe zakonisht vlerat e tyre fillestare korrespondente me ato në panelin e kontrollit. Për të parë variablat e ambientit përdoren komandlet Get-ChildItem ose sinonimet e tij (aliaset): ls dhe dir.
dir Env: 
Këto variabla përfaqësojnë sekuenca bajtësh (ose simbole, nëse preferoni), interpretimi i të cilave varet vetëm nga programi që i përdor. Komandlet *-Variable nuk funksionojnë me variablat e mjedisit. Për t'u qasur atyre, do të duhet të përdorni prefiksin e disku:
$env:TEST = "Hello, World!" 
Operatorët aritmetikë dhe operatorët e krahasimit
Në PowerShell ekzistojnë operatorë aritmetikë si: + (shumëzim), — (zbritje), * (shumzim), / (ndarje) dhe % (moduli ose mbetja e ndarjes). Rezultati i një shprehjeje aritmetike llogaritet nga majta në djathtë në përputhje me rendin e zakonshëm të operacioneve, dhe për grupimin e pjesëve të shprehjes përdoren kllapa të rrumbullakëta. Hapsirat mes operatorëve injorohen, ato përdoren vetëm për lehtësimin e kuptueshmërisë. Operatorët + gjithashtu bashkojnë, ndërsa operatori * përsërit vargjet. Kur përpiqeni të shtoni një numër në një varg, ai do të konvertohet në varg. Për më tepër, në gjuhën PowerShell ka shumë operatorë krahasues që kontrollojnë përputhshmërinë midis dy vlerave dhe kthejnë logjikën True ose False:
Operatori
Përshkrimi
Shembulli i kodit
-eq
E barabartë / Rrëzik (analogu = ose == në gjuhë të tjera)
$test = 100
$test -eq 123
-ne
Jo e barabartë / Nuk është e barabartë (analogu <> ose !=)
$test = 100
$test -ne 123
-gt
Më e madhe / Më shumë (analogu >)
$test = 100
$test -gt 123
-ge
Më e madhe ose e barabartë / Më shumë ose e barabartë (analogu >=)
$test = 100
$test -ge 123
-lt
Më e vogël / Më pak (analogu <)
$test = 100
$test -lt 123
-le
Më e vogël ose e barabartë / Më pak ose e barabartë (analogu <=)
$test = 100
$test -le 123
Ekzistojnë edhe operatorë të tjerë të ngjashëm që lejojnë, për shembull, krahasimin e vargjeve duke marrë parasysh karakterin e zëvendësimit ose përdorimin e shprehjeve të rregullta për të kërkuar përputhshmërinë me një model. Këta do t’i shqyrtojmë në artikujt e ardhshëm. Simbolet <, > dhe = për krahasim nuk përdoren, pasi janë të angazhuara 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. Në mënyrë të ngjashme, veprojnë edhe operatorët unarë ++ dhe —, të cilët rritin ose zvogëlojnë vlerën e një variable — ata gjithashtu i përkasin operatorëve të caktimit.
Operatorët logjikë
Për të përshkruar kushte komplekse, vetëm krahasimi nuk mjafton. Çdo shprehje logjike mund të shkruhet duke përdorur operatorët: -and, -or, -xor, -not dhe!.. Ata funksionojnë ashtu si në gjuhët e tjera të programimit, ndërsa 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 degëzimit në PowerShell janë standardë: IF(IF…ELSE, IF…ELSEIF…ELSE) dhe SWITCH. Le 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 < 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 ose vlera nuk është e përcaktuar"}
}
Ciklet
Në gjuhën PowerShell ka disa lloje cikli: WHILE, DO WHILE, DO UNTIL, FOR dhe FOREACH.
Cikli me parakushte funksionon, nëse/sa herë që kjo është e vërtetë:
[int]$test = 0
while ($test -lt 10) {
Write-Host $test
$test = $test + 1
}
Ciklet me postkushte do të funksionojnë të paktën një herë, sepse kontrollimi i kushteve bëhet pas përfundimit të iteracionit. Në këtë rast, DO WHILE funksionon derisa kushti të jetë i vërtetë, ndërsa DO UNTIL — derisa ai të jetë i falsë:
[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 të ciklit FOR është i njohur paraprakisht:
for ([int]$test = 0; $test -lt 10; $test++) {
Write-Host $test
}
Cikli FOREACH kryen iterimin e elementeve të një koleksioni ose vargu (hash-table):
$test_collection = "item1", "item2", "item3"
foreach ($item in $test_collection)
{
Write-Host $item
}
Tabelat
Në variablat PowerShell ruhet jo vetëm objekte të vetme (numra, strings, etj.), por edhe shumë. Lloji më i thjeshtë i këtyre variablave janë vargjet. Një varg mund të përmbajë disa elementë, një element ose të jetë bosh, që do të thotë se nuk ka asnjë element. Për ta shpallur, përdoret operatori @(), i cili do të na nevojitet në artikullin e ardhshëm — ai është shumë i rëndësishëm për të shtuar në varg vargje të tjera (krijimin e vargjeve shumëdimensionale), për të kaluar vargje në funksione si argument dhe për detyra të ngjashme:
$test_array = @() #krijoni një varg boshKur inicializoni një varg, vlerat e tij listohen me një presje (operatori special ,):
$test_array = @(1, 2, 3, 4) # krijoni një varg me katër elementë Në shumicën e rasteve, operatori @() mund të lihet jashtë:
$test_array = 1, 2, 3, 4Në këtë rast, një varg me një element inicializohet në këtë mënyrë
$test_array = , 1Për të qasje elementëve të vargut përdoret një indeks të plotë, që fillon nga zero dhe operatori i indeksit (kllapa katrore):
$test_array[0] = 1Mund të specifikoni disa indekse me një presje, përfshirë ata 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 pika — operatori i diapazonit) kthen një varg të numrave të plotë në një segment me kufij të caktuar përposht dhe lart. Për shembull, shprehja 1..4 jep një varg me katër elemente @(1, 2, 3, 4), ndërsa shprehja 8..5 — një varg @(8, 7, 6, 5).

Me ndihmën e operatorit të diapazonit mund të inicializoni një varg ($test_array = 1..4) ose të merrni një përzgjedhje (slice), që do të thotë se sekuenca e elementeve të një vargu është me indekse nga tjetri. Në këtë rast, numri negativ -1 do të tregojë elementin e fundit të vargut, -2 — para fundit, etj.
$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 një vargu të plotë mund të jenë më të mëdha se vlera maksimale e indeksit të vargut me të dhëna. Në këtë rast, kthehen të gjitha vlerat deri në të fundit:
$test_array[0..100]Nëse provoni të qaseni një elementi të vetëm joekzistues të vargut, kthehet vlera $null.

Në PowerShell, vargjet mund të përmbajnë elementë të tipave të ndryshëm ose të jenë të tipizuar me rigorozitet:
$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ë vargut.
Shembujt e krijimit të një vargu të tipizuar me rigorozitet:
[int[]]$test_array = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Tabelat e hash-it
Një tjetër tip themelor i variablave në gjuhën PowerShell — hash-table, i quajtur gjithashtu varg asociativ. HashTable është i ngjashëm me objektin JSON dhe ndërtohet mbi parimin e çelësit-vlerë. Përveç vargjeve të zakonshme, qasja në elementët e tyre bëhet përmes çelësave të emëruar, që janë prona të objektit (mund të përdoret gjithashtu operatori i indeksit — kllapa katrore).
Një hash-table bosh shpallet me simbolin ndihmës @ dhe kllapat operatorike:
$test_hashtable = @{}Gjatë shpalljes, mund të krijoni menjëherë çelësat 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ë hash-table, ju duhet të caktoni një çelës që ende nuk ekziston ose të përdorni metodën Add(). Nëse caktimi bëhet me një çelës ekzistues, vlera e tij do të ndryshohet. Për të fshirë një element nga hash-table, 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'] = "zëvendësojmë vlerën"
$test_hashtable.Remove("one") 
Këto lloje variablash mund të kalohen si argumente në funksione dhe komandlet — në artikullin e ardhshëm do të studiojmë se si bëhet kjo, si dhe do të shqyrtojmë një tjetër tip 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 t'i përshkruar ato, përdoret fjala kyçe Function, pas së cilës duhet të përcaktohet emri i funksionit dhe trupi i mbështjellur në kllapa operatorike. Kur është e nevojshme të kaloni argumente në funksion, ato mund të specifikohen menjëherë pas emrit në kllapa të rrumbullakëta.
function emri-funksionit (argument1, ..., argumentN)
{
trupi-i-funksionit
}
Funksioni gjithmonë kthen 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ë të vetme, kthehet një vlerë e vetme e tipit përkatës. Konstrukti return $value shton një element me vlerën $value në array-n e rezultateve dhe ndërpret ekzekutimin e listës së deklaratave, ndërsa një funksion i zbrazët kthen $null.
Për shembull, le të krijojmë një funksion që përfundon një numër në katror:
function sqr ($number)
{
return $number * $number
}
Vrejtim: në trupin e funksionit mund të përdoren çdo variabël e shpallur para thirrjes së tij, dhe thirrja e funksioneve në PowerShell mund të duket e çuditshme: argumentet (nëse ka) nuk janë të rrethuara 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ë funksioni vetë duhet të rrethohesh në kllapa:
function test_func ($n) {}
test_func -eq $null # funksioni nuk u thirr
(test_func) -eq $null # rezultati i shprehjes — $true 
Kur përshkruani një funksion, mund t'u jepni argumenteve vlera sipas defautit:
function func ($arg = value) {
#trupi i funksionit
}
Ekziston një sintaksë tjetër përshkrimi të argumenteve të funksionit, përveç kësaj parametrat mund të lexohen nga tubi — gjithçka kjo do të jetë e nevojshme në artikullin e ardhshëm, kur do të shqyrtojmë modulet e eksportuara dhe krijimin e komandleteve tona të veta.
Trajtimi i gabimeve
Në PowerShell ka një mekanizëm Try…Catch…Finally, që lejon trajtimin e situatave të jashtme. Në bllokun Try vendoset kodi, në të cilin mund të ndodhin gabime, ndërsa në bllokun Catch — trajtuesi i tyre. Nëse nuk ka gabime, ai nuk ekzekutohet. Blloku Finally ekzekutohet pas bllokut Try pa marrë parasysh nëse ka ndodhur ndonjë gabim, dhe mund të ketë disa blloqe Catch për përjashtime të tipeve të ndryshme. Vetë përjashtimi regjistrohet në një variabël që nuk kërkon shpallje sipas defautit ($_) dhe mund të nxirret lehtësisht. Në shembullin më poshtë realizojmë mbrojtjen nga hyrja e një vlere të gabuar:
try {
[int]$test = Read-Host "Shkruani një numër"
100 / $test
} catch {
Write-Warning "Numri i pavlefshëm"
Write-Host $_
}

Me këtë, shqyrtimi i elementeve të programimit në gjuhën PowerShell është përfunduar. Në artikujt e ardhshëm do të shqyrtojmë me detaje punën me variablat e tipeve të ndryshme, koleksionet, shprehjet rregullore, krijimin e funksioneve, moduleve dhe komandleteve tona, si dhe programimin e orientuar në objekte.
Burimi: habr.com
