Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

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.

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

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. Əvvəlki məqalə 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:

Şərhlər
Dəyişənlər və onların tipləri
Sistem dəyişənləri
Görünüş sahələri
Mühit dəyişənləri
Riyazi operatorlar və müqayisə operatorları
Təyin etmə operatorları
Məntiqi operatorlar
Şərti keçid
Döngülər
Massivlər
Hash cədvəlləri
Funksiyalar
Səhv emalı

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:

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

Dəyişəni ilkinləşdirmək (ona dəyər vermək) üçün təyin etmə operatoru (= simvolu) istifadə olunur:

$test = 100

Də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]100

PowerShell-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

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

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

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

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

Bu ü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

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

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

ls Variable: | more

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

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:

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

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

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

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ır

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

Bu halda, bir elementdən ibarət massiv aşağıdakı kimi başlanır

$test_array = , 1

Massivin 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] = 1

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

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

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.

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

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.

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

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

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

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 2

və ya belə:

sqr -number 2

Arqumentlə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

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

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

}

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

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.

Windows PowerShell nədir və nə üçün istifadə olunur? Hissə 2: proqramlaşdırma dilinə giriş

Mənbə: habr.com

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster