Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

Historikisht, utilitat e komandave në sistemet Unix janë zhvilluar më mirë se në Windows, megjithatë, me shfaqjen e zgjidhjeve të reja, situata ka ndryshuar.

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

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. Artikulli i mëparshëm 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:

Komentet
Variablat dhe tipet e tyre
Variablat sistemike
Fushat e dukshmërisë
Variablat e mjedisit
Operatorët aritmetikë dhe operatorët e krahasimit
Operatorët e caktimit
Operatorët logjikë
Kalimi kushtor
Ciklet
Tabelat
Tabelat e hash-it
Funksionet
Trajtimi i gabimeve

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:

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

Për të inicializuar një variabël (për t'i dhënë asaj një vlerë) përdoret operatori i caktimit (simboli =):

$test = 100

Një 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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

Për të parë variablat e shpallura dhe vlerat e tyre mund të përdoret komandle specifike:

Get-Variable | more

Ky 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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

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: | more

ose

ls Variable: | more

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

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:

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

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!"

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

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 bosh

Kur 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, 4

Në këtë rast, një varg me një element inicializohet në këtë mënyrë

$test_array = , 1

Pë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] = 1

Mund 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]

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

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.

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

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 2

ose kështu:

sqr -number 2

Pë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

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

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 $_

}

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

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.

Çfarë është Windows PowerShell dhe për çfarë përdoret? Pjesa 2: hyrje në gjuhën e programimit

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster