Tarixən Unix sistemlərində əmr xətləri alətləri Windows'dan daha yaxşı inkişaf etdirilib, lakin yeni bir həllin ortaya çıxması ilə vəziyyət dəyişdi.
PowerShell üçün müasir çox paradigmalı bir dildə skriptlər yazmaq mümkündür. Dildə klassik prosedur, obyektyönümlü və hətta funksional proqramlaşdırma elementləri var: şərti keçid, döngülər, dəyişənlər, massivlər, hash cədvəlləri, siniflər, səhv emalı, habelə funksiyalar, komandletlər və boru xətləri. iş mühiti ilə işləmək üçün əsaslara həsr olunub, indi isə biz oxucular üçün proqramçılar üçün kiçik bir bələdçi təqdim edirik.
Mündəricat:
Kodu hər hansı bir mətn redaktorunda yazmaq mümkündür və ya inteqrə olunmuş inkişaf mühitindən istifadə edə bilərsiniz - ən asanı Microsoft-un server əməliyyat sistemləri quraşdırması içində olan Windows PowerShell ISE-dən istifadə etməkdir. Bu, yalnız kifayət qədər mürəkkəb skriptlər üçün lazım idi: qısa əmrlər dəstini interaktiv rejimdə yerinə yetirmək daha asandır.
Şərhlər
Şərh yazmaq proqramlaşdırma stilinin bir hissəsi olaraq düzgün ara vermə və boşluqlarla birlikdə hesab edilir:
# Для строчных комментариев используется символ решетки — содержимое строки интерпретатор не обрабатывает.
<#
Так обозначаются начало и конец блочного комментария.
Заключенный между ними текст интерпретатор игнорирует.
#>
Dəyişənlər və onların tipləri
PowerShell-də dəyişənlər - adlandırılmış obyektlərdir. Onların adları alt xətkeş, eləcə də hərflər və rəqəmlər daxildir. Adın qarşısında həmişə $ simvolu istifadə olunur. Dəyişəni elan etmək üçün interpretatora yalnız uyğun adı göstərmək kifayətdir:

Dəyişəni ilkinləşdirmək (ona dəyər vermək) üçün təyin etmə operatoru (= simvolu) istifadə olunur:
$test = 100Dəyişəni onun tipini göstərərək (tip dönüşüm operatoru) adı və ya dəyəri ilə kvalifikasiya edərək elan etmək mümkündür:
[int]$test = 100
$test = [int]100PowerShell-də dəyişənlərin tam obyektlər (siniflər) olduğu və .NET Core-da mövcud olan tiplərə əsaslandığı başa düşmək vacibdir. Əsas olanları sadalayırıq:
Tip (sinif .NET)
Təsvir
Kod nümunəsi
[string]
System.String
Unicode sətiri
$test = "test"
$test = 'test'
[char]
System.Char
Unicode simvolu (16 bit)
[char]$test = 'c'
[bool]
System.Boolean
Boolean tipi (doğru ya da yanlış məna)
[bool]$test = $true
[int]
System.Int32
32 bitlik tam ədəd (32 bit)
[int]$test = 123456789
[long]
System.Int64
64 bitlik tam ədəd (64 bit)
[long]$test = 12345678910
[single]
System.Single
32 bit uzunluğunda ondalık ədəd
[single]$test = 12345.6789
[double]
System.Double
64 bit uzunluğunda ondalık ədəd (8 byte)
[double]$test = 123456789.101112
[decimal]
System.Decimal
128 bit uzunluğunda ondalık ədəd (mütləq sonuna d əlavə etmək)
[decimal]$test = 12345.6789d
[DateTime]
System.DateTime
tarix və vaxt
$test = Get-Date
[array]
System.Object[]
array, element indeksinin başlaması 0-dan başlayır
$test_array = 1, 2, «test», 3, 4
[hashtable]
System.Collections.Hashtable
hash cədvəlləri — adlandırılmış açarlarla əlaqəli massivlər @{açar = «dəyər»} prinsipi ilə qurulmuşdur
$test_hashtable = @{one=«bir»; two=«iki»; three=«üç»}
PowerShell, dəyişənlərin tipini avtomatik olaraq dəyişə bilir; tip, əgər məcburi göstərilməyibsə, dəyişə bilər (məsələn, təyin etmə əmri vasitəsilə) və bu halda şərh verən səhv göstərəcək. Yuxarıdakı misaldan dəyişənin tipini belirlemek üçün GetType() metodunu çağırmaq mümkündür:
$test.GetType().FullName 
Dəyişənləri idarə etmək üçün bir sıra komandletlər mövcuddur. Onların siyahısını rahat şəkildə əldə etmək üçün:
Get-Command -Noun Variable | ft -Property Name, Definition -AutoSize -Wrap 
Təyin olunan dəyişənlərin və onların dəyərlərinin görüntülənməsi üçün xüsusi bir komandlet istifadə edilə bilər:
Get-Variable | moreBu üsul bir qədər həcmli görünsə də, dəyişənlərlə işləmək operatorlar vasitəsilə və ya onların atributları və metodlarına birbaşa müraciət etmək daha rahatdır. Buna baxmayaraq, komandletlərin varlığını müsbət qiymətləndirmək lazımdır, çünki əlavə parametrlər təyin etməyə imkan tanıyır. Vacibdir ki, istifadəçi dəyişənləri yalnız cari sessiya daxilində müəyyən edilir. Konsolu bağlayanda və ya ssenarini bitirəndə silinir.
Sistem dəyişənləri
İstifadəçi tərəfindən təyin edilən dəyişənlərdən əlavə, cari sessiyadan sonra silinməyən daxili (sistem) dəyişənlər mövcuddur. Onlar iki tura bölünür, burada PowerShell-in vəziyyət məlumatları avtomatik dəyişənlərdə saxlanılır, bunlara özbaşına təsadüfi dəyərlər təyin etmək mümkün deyil. Məsələn, $PWD:
$PWD.Path 
İstifadəçi parametrlərini saxlamaq üçün seçim dəyişənləri lazımdır ki, onların dəyərlərini dəyişmək mümkündür. Məsələn, $ErrorActionPreference vasitəsilə, komandların kritik olmayan səhvlərin baş verməsi halında interpretatorun reaksiyası müəyyən edilir.
Dəyişənlərə müraciət etmək üçün operatorlar və komandletlərdən əlavə, Variable: süni yığıcı var. Bu ilə digər yığıcılara bənzər işləyə bilərsiniz, dəyişənlər bu halda fayl sisteminin obyektlərinə oxşayır:
Get-ChildItem Variable: | morevə
ls Variable: | more 
Görünüş sahələri
PowerShell-da dəyişənlərin görünməsi (Scope) anlayışı mövcuddur. Qlobal görünmə (Global) cari sessiyanın bütün hissələrini əhatə edir — məsələn, sistem dəyişənləri buna daxildir. Lokal (Local) dəyişənlər yalnız onların müəyyən edildiyi sferada əlçatan olur: məsələn, bir funksiyanın içində. Ssenari görünməsi (Script) anlayışı da mövcuddur, lakin skript əmrləri üçün əslində lokal hesab olunur. Dəyişənlər elan edildikdə, onlara avtomatik olaraq lokal görünmə təyin edilir, bunu dəyişdirmək üçün $Global: dəyişən = dəyər formasında xüsusi bir qurğu tələb olunur.
Məsələn, belə:
$Global:test = 100
Mühit dəyişənləri
PowerShell-da ayrıca bir Env: saxlama yeri də vardır, bunun vasitəsilə mühit dəyişənlərinə müraciət etmək mümkündür. Terminal başladıqda, bu dəyişənlər ana prosesi (yəni cari sessiyanı başlatmış proqramdan) kopyalanır və adətən onların ilkin dəyərləri paneldəki dəyərlərlə üst-üstə düşür. Mühit dəyişənlərini görüntüləmək üçün Get-ChildItem cmdlet-i və ya onun imzalarını (alias-larını): ls və dir istifadə etmək mümkündür.
dir Env: 
Bu dəyişənlər bayt sıraları (şəkil olaraq istəsəniz simvollar)dır, onların şərh edilməsi yalnız onları istifadə edən proqramdan asılıdır. *-Variable cmdlet-ləri mühit dəyişənləri ilə işləmirlər. Onlara müraciət etmək üçün disk ön əlavəsini istifadə etmək lazımdır:
$env:TEST = "Hello, World!" 
Riyazi operatorlar və müqayisə operatorları
PowerShell-da aşağıdakı arifmetik operatorlar mövcuddur: + (toplama), — (çıxma), * (vurma), / (bölmə) və % (modul və ya bölmədə qalıq). Arifmetik ifadənin nəticəsi soldan sağa qəbul edilmiş əməliyyatlardan asılı olaraq hesablanır və ifadənin hissələrinin qruplaşdırılması üçün dairəvi skoblar tətbiq edilir. Operatorlar arasındakı boşluqlar nəzərə alınmır, onlar yalnız anlamağı asanlaşdırmaq üçün istifadə olunur. + operatoru eyni zamanda birləşdirir, * operatoru isə sətirləri təkrarlayır. Bir ədədi sətirə əlavə etməyə çalışanda, o, sətirə çevriləcəkdir. Bundan əlavə, PowerShell dilində iki dəyərin uyğunluğunu yoxlayan və mantıksal True və ya False qaytaran çox sayda müqayisə operatoru mövcuddur:
Operator
Təsvir
Kod nümunəsi
-eq
Bərabərdir / Rəqib (digər dillərdəki = və ya ==-ə bənzər)
$test = 100
$test -eq 123
-ne
Bərabər deyil / Bərabər deyil (digər dillərdəki və ya !=-ə bənzər)
$test = 100
$test -ne 123
-gt
Böyükdür / Böyüklük (digər dillərdəki >-ə bənzər)
$test = 100
$test -gt 123
-ge
Böyükdür və ya bərabərdir / Böyüklük və ya bərabər (digər dillərdəki >=-ə bənzər)
$test = 100
$test -ge 123
-lt
Kiçikdir / Kiçiklik (digər dillərdəki <-ə bənzər)
$test = 100
$test -lt 123
-le
Kiçikdir və ya bərabərdir / Kiçiklik və ya bərabər (digər dillərdəki <=-ə bənzər)
$test = 100
$test -le 123
Bənzər digər operatorlar da mövcuddur ki, bunlar, məsələn, mücərrəd simvollar vasitəsilə sətirləri müqayisə etməyə və ya müntəzəm ifadələri pattern-ə uyğun şəkildə istifadə etməyə imkan tanıyır. Biz bunları növbəti məqalələrdə geniş şəkildə müzakirə edəcəyik. və = simvolları müqayisədə işləmir, çünki başqa məqsədlər üçün istifadə olunur.
Təyin etmə operatorları
Ən çox istifadə olunan operatorlardan savayı = digər təyin etmə operatorları da vardır: +=, -=, *=, /= və %= . Onlar təyin etmədən əvvəl dəyərləri dəyişir. Eyni qaydada, dəyəri artıran və ya azaldan unar operatorları ++ və — da var. Bunlar da təyin etmə operatorlarına aiddir.
Məntiqi operatorlar
Mürəkkəb şərtləri təsvir etmək üçün sadəcə müqayisə yetərli deyil. Hər hansı məntiqi ifadələri aşağıdakı operatorlar vasitəsilə yazmaq olar: -and, -or, -xor, -not və!.. Onlar digər proqramlaşdırma dillərində olduğu kimi işləyir, buna görə də hesablamaların ardıcıllığını müəyyən etmək üçün parantezlərdən istifadə etmək mümkündür.
("Test" -eq "Test") -and (100 -eq 100)
-not (123 -gt 321)
!(123 -gt 321)
Şərti keçid
PowerShell-də şaxələndirmə operatorları standartdır: IF(IF…ELSE, IF…ELSEIF…ELSE) və SWITCH. Bunların istifadəsini misallarla araşdıraq:
[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 və ya dəyər qeyri-müəyyəndir"}
}
Döngülər
PowerShell dilində bir neçə dövr növü var: WHILE, DO WHILE, DO UNTIL, FOR və FOREACH.
Şərtli dövr, şərt doğru olduqda işləyir:
[int]$test = 0
while ($test -lt 10) {
Write-Host $test
$test = $test + 1
}
Post-şərtli dövrlər ən azı bir dəfə fəaliyyət göstərəcək, çünki şərtin yoxlaması iterasiyadan sonra aparılır. Bu zaman DO WHILE şərt doğru olduğu müddətdə işləyir, DO UNTIL isə yanlış olduğu müddətdə:
[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)
FOR dövrünün iterasiya sayı əvvəlcədən məlumdur:
for ([int]$test = 0; $test -lt 10; $test++) {
Write-Host $test
}
FOREACH dövründə massiv və ya kolleksiyanın (hash cədvəlinin) elementlərini dövr edir:
$test_collection = "item1", "item2", "item3"
foreach ($item in $test_collection)
{
Write-Host $item
}
Massivlər
PowerShell dəyişənlərində tək obyektlər (rəqəm, string və s.) deyil, çoxlu obyektlər də saxlanılır. Bu cür dəyişənlərin ən sadə növü massivlərdir. Massiv bir neçə elementdən, bir elementdən ibarət ola bilər və ya elementlərə malik olmaya bilər. Onu elan etmək üçün @() operatoru istifadə olunur, bu, daha sonra vacib olacaq — digər massivləri əlavə etmək (çoxölçülü massivlər yaratmaq), massivləri funksiyalara arqument kimi keçirmək və ona bənzər məsələlər üçün:
$test_array = @() #boş massiv yaradırMassivi başlatarkən onun dəyərləri vergül ilə sıralanır (xüsusi operator ,):
$test_array = @(1, 2, 3, 4) # dörd elementdən ibarət massiv yaradır Çox vaxt @() operatorunu buraxmaq mümkündür:
$test_array = 1, 2, 3, 4Bu halda, bir elementdən ibarət massiv aşağıdakı kimi başlanır
$test_array = , 1Massivin elementlərinə erişmək üçün sıfırdan başlayan tam ədədi indeks və indeks operatoru (dördkünc mötbəq) istifadə edilir:
$test_array[0] = 1Bir neçə indeks vergül ilə ayrılaraq, o cümlədən təkrarlananlar da göstərilə bilər:
$test_array = "bir", "iki", "üç", "dörd"
$test_array[0,1,2,3]
$test_array[1,1,3,3,0] 
Operator .. (iki nöqtə - aralıq operatoru) müəyyən bir üst və alt hədd ilə tam ədədlər massivini qaytarır. Məsələn, ifadə 1..4 dörd elementdən ibarət massiv qaytarır @(1, 2, 3, 4), 8..5 ifadəsi isə @(8, 7, 6, 5) massivi qaytarır.

Aralıq operatoru vasitəsilə massiv başlanğıcı edilə bilər ($test_array = 1..4) və ya bir massivdən digərinin indeksləri ilə elementlər ardıcıllığı (slice) əldə edilə bilər. Bu zaman -1 təsviri sonuncu elementi, -2 isə əvvəlki elementi ifadə edir.
$test_array = "bir", "iki", "üç", "dörd"
$test_array[0..2]
$test_array[2..0]
$test_array[-1..0]
$test_array[-2..1]Diqqət yetirin ki, tam ədəd massivinin dəyərləri massivin indeksinin maksimum dəyərindən böyük ola bilər. Bu halda, sonuncuya qədər bütün dəyərlər qaytarılır:
$test_array[0..100]Mövcud olmayan tək bir elementə müraciət etməyə çalışdıqda, $null dəyəri qaytarılır.

PowerShell-də massivlər müxtəlif tiplərdəki elementləri saxlaya bilər və ya sərt tiplidirlər:
$test_array = 1, 2, "test", 3, 4
for ([int]$i = 0; $i -lt $test_array.count; $i++)
{
Write-Host $test_array[$i]
}
Burada $test_array.count xassəsi - massivdəki elementlərin sayını göstərir.
Sərt tipləndirilmiş massiv yaratmağa dair misal:
[int[]]$test_array = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Hash cədvəlləri
PowerShell dilində daha bir əsas dəyişən tipi - hash cədvəlləridir ki, bunlar həmçinin assosiasiya massivləri adlanır. Hashtable JSON obyekti kimi oxşardır və açar-dəyər prinsipi ilə qurulur. Adi massivlərdən fərqli olaraq, elementlərinə adlandırılmış açarlar vasitəsilə daxil olunur ki, bu da obyektin xassələridir (həmçinin indeks operatoru - dördkünc mötbəq istifadə edilə bilər).
Boş hash cədvəl @ simvolu və operator mötbəqləri ilə elan olunur:
$test_hashtable = @{}İlan edərkən açarları dərhal yaratmaq və onlara dəyərlər vermək mümkündür:
$test_hashtable = @{one="bir"; two="iki"; three="üç"; "some key"="some value"}Hash cədvəlinə element əlavə etmək üçün hələ mövcud olmayan açar təyin etmək və ya Add(). metodundan istifadə etmək lazımdır. Əgər var olan açar ilə təyin edilmək olarsa, onun dəyəri dəyişəcəkdir. Hash cədvəlindən element silmək üçün Remove() metodu istifadə olunur.
$test_hashtable."some key"
$test_hashtable["some key"]
$test_hashtable.Add("dörd", "dörd")
$test_hashtable.beş = "beş"
$test_hashtable['beş'] = "dəyəri dəyişdir"
$test_hashtable.Remove("bir") 
Belə növ dəyişənlər funksiyalara və komandletlərə arqument kimi ötürülə bilər — növbəti məqalədə bunun necə edildiyini öyrənəcəyik və həmçinin daha bir oxşar növü — PSCustomObject-u nəzərdən keçirəcəyik.
Funksiyalar
PowerShell dilində prosedur proqramlaşdırması üçün bütün zəruri elementlər, o cümlədən funksiyalar var. Onların təsviri üçün Function açar sözü istifadə olunur, ardından funksiyanın adı və arqumentləri açar parantezlərdə göstərilməlidir.
function funksiya-adı (arqument1, ..., arqumentN)
{
funksiyanın bədəni
}
Funksiya həmişə nəticə qaytarır — əgər bir neçə ifadə varsa, onların hamısının nəticələrinin massivini qaytarır. Bir ifadə varsa, müvafiq tipdən tək bir dəyəri qaytarır. return $value konstruksiyası $value dəyəri olan elementi nəticələr massivinə əlavə edir və statement list-in icrasını dayandırır, boş funksiya isə $null qaytarır.
Məsələn, gəlin bir ədədi kvadrata qaldıran funksiyanı yaradaq:
function sqr ($number)
{
return $number * $number
}
Qeyd edək ki, funksiyanın bədii daxilində, onun çağırılmasından əvvəl elan olunmuş istənilən dəyişəni istifadə etmək mümkündür, həmçinin PowerShell-də funksiyaların çağırılması qeyri-adi görünə bilər: arqumentlər (əgər varsa) açar parantezlərdə deyil, boşluqlarla ayrılır.
sqr 2və ya belə:
sqr -number 2Arqumentlərin ötürülmə tərzinə görə, bəzən funksiyanı parantezlərə almaq lazım gəlir:
function test_func ($n) {}
test_func -eq $null # funksiyaya çağrılmamışdır
(test_func) -eq $null # ifadənin nəticəsi — $true 
Funksiyanı təsvir edərkən arqumentlərə standart dəyərlər vermək mümkündür:
function func ($arg = dəyər) {
#funksiyanın bədəni
}
Funksiyanın arqumentlərini təsvir edərkən başqa bir sintaksis də mövcuddur, həmçinin parametrlər konveyerdən oxuna bilər — bunlar növbəti məqalədə ixrac olunan modulları və öz komandletlərimizi yaratdığımız zaman faydalı olacaq.
Səhv emalı
PowerShell-də Try…Catch…Finally mexanizmi mövcuddur ki, bu da istisna halları idarə etməyə imkan verir. Try blokuna səhv baş verə biləcək kod yerləşdirilir, Catch blokuna isə onun emalı. Əgər səhv yoxdursa, bu icra olunmur. Finally bloku, səhv baş verməsindən asılı olmayaraq Try blokundan sonra icra olunur, Catch blokları isə müxtəlif tipli istisnalar üçün bir neçə ola bilər. İstisna özlüyündə elan olunmadan dəyişkənə ($_) yazılır və asanlıqla çıxarıla bilər. Aşağıdakı nümunədə biz səhv dəyərin daxil edilməsinin qarşısını alırıq:
try {
[int]$test = Read-Host "Bir ədəd daxil edin"
100 / $test
} catch {
Write-Warning "Yanlış ədəd"
Write-Host $_
}

Bu, PowerShell proqramlaşdırma dilində əsasların müzakirəsini bitirir. Növbəti məqalələrdə müxtəlif növ dəyişənlərlə, kolleksiyalarla, müntəzəm ifadələrlə, funksiyaların, modulların yaradılması və öz komandletlərimizin yaradılması, habelə obyekt yönümlü proqramlaşdırma ilə daha yaxın tanış olacağıq.
Mənbə: habr.com
