Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

Tarixən, Unix sistemlərində komanda xətti utilitləri Windows-dan daha yaxşı inkişaf etmişdir, lakin yeni həll yolu ilə vəziyyət dəyişdi.

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

PowerShell klassik prosedur, obyekt yönümlü və hətta funksional proqramlaşdırma elementlərinə malik olan şərh edilmiş, çoxparadiqma dilində yazıla bilər: şərti budaqlanma, döngələr, dəyişənlər, massivlər, hash cədvəlləri, siniflər, səhvlərin idarə edilməsi, həmçinin funksiyalar, cmdletlər və boru kəmərləri. Əvvəlcədən statya mühitdə işləməyin əsaslarına həsr olunmuşdu və indi oxucularımıza proqramçılar üçün kiçik bir məlumat kitabı təqdim edirik.

Mündəricat:

Şərhlər
Dəyişənlər və onların növləri
Sistem dəyişənləri
Əhatə dairələri
Ətraf mühit dəyişənləri (mühit)
Arifmetik və müqayisə operatorları
Təyinat operatorları
Məntiqi operatorlar
Şərti atlama
Dövrlər
Diziler
Hash cədvəlləri
Funksiyalar
Emal zamanı xəta

Siz istənilən mətn redaktorunda və ya inteqrasiya olunmuş inkişaf mühitindən istifadə edərək kod yaza bilərsiniz - ən asan yol Microsoft server əməliyyat sistemləri ilə birlikdə gələn Windows PowerShell ISE-ni götürməkdir. Bu, yalnız kifayət qədər mürəkkəb skriptlər üçün lazımdır: qısa əmrlər dəstlərini interaktiv şəkildə yerinə yetirmək daha asandır.

Şərhlər

Şərhlərdən istifadə düzgün girinti və boşluqla yanaşı yaxşı proqramlaşdırma üslubunun bir hissəsi hesab olunur:

# Для строчных комментариев используется символ решетки — содержимое строки интерпретатор не обрабатывает.

<# 

       Так обозначаются начало и конец блочного комментария. 
       Заключенный между ними текст интерпретатор игнорирует.

#>

Dəyişənlər və onların növləri

PowerShell-də dəyişənlər adlandırılmış obyektlərdir. Onların adlarına alt xətt simvolu, həmçinin hərflər və rəqəmlər daxil ola bilər. $ simvolu həmişə addan əvvəl istifadə olunur və dəyişəni elan etmək üçün tərcüməçiyə etibarlı ad vermək kifayətdir:

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

Dəyişənləri işə salmaq (ona qiymət təyin etmək) üçün təyin operatorundan (simvol =) istifadə olunur:

$test = 100

Siz dəyişəni ad və ya dəyərdən əvvəl onun növünü kvadrat mötərizədə (tip tökmə operatoru) göstərərək elan edə bilərsiniz:

[int]$test = 100

$test = [int]100

PowerShell-dəki dəyişənlərin növləri .NET Core-da olanlara əsaslanan xassələri və metodları olan tam hüquqlu obyektlər (siniflər) olduğunu başa düşmək vacibdir. Əsas olanları sadalayırıq:

Növ (.NET sinfi)

Təsvir

Kod nümunəsi

[string] System.String

Unicode sətri 

$test = "test"
$test = 'test'

[char]System.Char

Unicode simvolu (16 bit)

[char]$test = 'c'

[bool] System.Boolean

boolean növü (boolean Doğru və ya Yanlış)

[bool]$test = $true

[int] System.Int32

otuz iki bit tam ədəd (32 bit)

[int]$test = 123456789

[uzun] System.Int64

altmış dörd bit tam ədəd (64 bit)

[uzun]$test = 12345678910

[tək] Sistem.Tək

üzən nöqtə sayı 32 bit uzunluğunda

[tək]$test = 12345.6789

[ikiqat]Sistem.Double

uzunluqlu üzən nöqtə sayı 64 bit (8 bayt)

[double]$test = 123456789.101112

[onluq]Sistem.Onluq

128 bitlik üzən nöqtə nömrəsi (d ilə bitmək tələb olunur)

[onluq]$test = 12345.6789d

[TarixSaat]System.DateTime

tarix və vaxt 

$test = GetDate

[massiv] System.Object[]

element indeksi 0-dan başlayan massiv

$test_massivi = 1, 2, "test", 3, 4

[hashtable] System.Collections.Hashtable

hash cədvəlləri aşağıdakı prinsipə uyğun qurulmuş adlanmış açarları olan assosiativ massivlərdir: @{key = "dəyər"}

$test_hashtable = @{bir="bir"; iki="iki"; üç="üç"}

PowerShell gizli tip konvertasiyanı dəstəkləyir, əlavə olaraq dəyişənin növü dərhal dəyişdirilə bilər (məsələn, təyinat operatorundan istifadə etməklə), əgər məcburi şəkildə göstərilməyibsə - bu halda tərcüməçi səhv verəcəkdir. GetType() metodunu çağırmaqla əvvəlki nümunədən dəyişənin növünü təyin edə bilərsiniz:

$test.GetType().FullName

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

Dəyişənləri manipulyasiya etmək üçün bir sıra cmdletlər var. Onların siyahısı rahat formada əmrdən istifadə etməklə göstərilir:

Get-Command -Noun Variable | ft -Property Name, Definition -AutoSize -Wrap

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

Elan edilmiş dəyişənlərə və onların dəyərlərinə baxmaq üçün xüsusi cmdletdən istifadə edə bilərsiniz:

Get-Variable | more

Bu üsul həddən artıq çətin görünür, dəyişənlərlə operatorlar vasitəsilə və ya onların xassələrinə və metodlarına birbaşa daxil olmaqla işləmək daha rahatdır. Bununla belə, cmdletlərin mövcud olmaq hüququ var, çünki onlar bəzi əlavə parametrlər təyin etməyə imkan verir. İstifadəçi dəyişənlərinin yalnız cari sessiya daxilində müəyyən edildiyini başa düşmək vacibdir. Konsol bağlandıqda və ya skript bitdikdə, onlar silinir.

Sistem dəyişənləri

İstifadəçi tərəfindən elan edilənlərə əlavə olaraq, cari sessiya bitdikdən sonra silinməyən daxili (sistem) dəyişənləri var. Onlar iki növə bölünür, PowerShell dövlət məlumatları isə özbaşına ixtiyari dəyərlər təyin edilə bilməyən avtomatik dəyişənlərdə saxlanılır. Bunlara, məsələn, $PWD daxildir:

$PWD.Path

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

Dəyərləri dəyişdirilə bilən istifadəçi seçimlərini saxlamaq üçün üstünlük dəyişənləri lazımdır. Məsələn, $ErrorActionPreference istifadə edərək, əmr tərcüməçisinin ölümcül olmayan səhvlərin baş verməsinə reaksiyası təyin edilir.

Elan edilmiş dəyişənlərə daxil olmaq üçün operatorlara və cmdletlərə əlavə olaraq, bir Dəyişən var: psevdo-akkumulyator. Onunla digər sürücülərlə bənzətmə yolu ilə işləyə bilərsiniz və bu halda dəyişənlər fayl sistemi obyektlərinə bənzəyir:

Get-ChildItem Variable: | more

və ya

ls Variable: | more

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

Əhatə dairələri

PowerShell-də dəyişənlər üçün əhatə dairəsi (Scope) anlayışı var. Qlobal əhatə dairəsinin (Qlobal) hərəkəti bütün cari sessiyaya aiddir - o, məsələn, sistem dəyişənlərini ehtiva edir. Yerli (Yerli) dəyişənlər yalnız müəyyən edildiyi əhatə dairəsində mövcuddur: funksiya daxilində deyin. Skriptin əhatə dairəsi (skript) anlayışı da var, lakin skript əmrləri üçün o, mahiyyətcə yerlidir. Varsayılan olaraq, dəyişənləri elan edərkən onlara lokal əhatə dairəsi verilir və bunu dəyişmək üçün sizə xüsusi konstruksiya lazımdır: $Qlobal: dəyişən = dəyər.

Məsələn, bu kimi:

$Global:test = 100

Ətraf mühit dəyişənləri (mühit)

Başqa bir psevdo-sürücü, Env:, PowerShell-dən mövcuddur və ətraf mühit dəyişənlərinə daxil olmaq üçün istifadə edilə bilər. Qabıq işə salındıqda, onlar ana prosesdən (yəni cari sessiyanı başlatan proqramdan) kopyalanır və adətən onların ilkin dəyərləri idarəetmə panelindəki dəyərlərlə eyni olur. Mühit dəyişənlərinə baxmaq üçün Get-ChildItem cmdletindən və ya onun ləqəblərindən (ləqəblərindən) istifadə edin: ls və dir.

dir Env:

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

Bu dəyişənlər baytların ardıcıllığıdır (və ya simvollar, istəsəniz), şərhi yalnız onlardan istifadə edən proqramdan asılıdır. *-Variable cmdletləri mühit dəyişənləri ilə işləmir. Onlara daxil olmaq üçün sürücü prefiksindən istifadə etməlisiniz:

$env:TEST = "Hello, World!"

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

Arifmetik və müqayisə operatorları

PowerShell aşağıdakı arifmetik operatorları təmin edir: + (əlavə), - (çıxma), * (çoxaltma), / (bölmə) və % (modul və ya modul). Arifmetik ifadənin nəticəsi ümumi qəbul edilmiş əməllər sırasına uyğun olaraq soldan sağa qiymətləndirilir və ifadənin hissələrini qruplaşdırmaq üçün mötərizələrdən istifadə olunur. Operatorlar arasındakı boşluqlar nəzərə alınmır, onlar yalnız oxumağı asanlaşdırmaq üçün istifadə olunur. + operatoru da birləşdirir və * operatoru sətirləri təkrarlayır. Əgər sətirə nömrə əlavə etməyə çalışsanız, o, sətirə çevriləcək. Bundan əlavə, PowerShell dilində iki dəyər arasında uyğunluğu yoxlayan və boolean True və ya False qaytaran bir çox müqayisə operatorları var:

Operator

Təsvir

Kod nümunəsi

-eq

Bərabər / Bərabər (digər dillərdə = və ya == ilə oxşar)

$test = 100
$test -ekv 123 

- yox

Bərabər deyil / Bərabər deyil (<> və ya != ilə oxşar)

$test = 100
$test -ne 123   

-gt

Böyük / Daha çox (analoq >)

$test = 100
$test -gt 123

-Ge

Böyük və ya bərabər / Böyük və ya bərabər (>= ilə oxşar)

$test = 100
$test -ge 123

-lt

Az / Az (< ilə oxşar)

$test = 100
$test -lt 123  

-

Kiçik və ya bərabər / Kiçik və ya bərabər (<= ilə oxşar)

$test = 100
$test -le 123

Digər oxşar operatorlar da var ki, onlar, məsələn, joker işarə əsasında sətirləri müqayisə etməyə və ya nümunəyə uyğun gəlmək üçün müntəzəm ifadələrdən istifadə etməyə imkan verir. Gələcək yazılarımızda onlara ətraflı toxunacağıq. <, > və = simvolları müqayisə üçün istifadə edilmir, çünki onlar başqa məqsədlər üçün istifadə olunur.

Təyinat operatorları

Ən çox yayılmış = operatorundan əlavə başqa təyin operatorları da var: +=, -=, *=, /= və %=. Təyinatdan əvvəl dəyəri dəyişirlər. Dəyişənin qiymətini artıran və ya azaldan ++ və - birlik operatorları da eyni şəkildə davranırlar - təyinat operatorlarına da aiddir.

Məntiqi operatorlar

Mürəkkəb şərtləri təsvir etmək üçün təkcə müqayisə kifayət deyil. Operatorlardan istifadə edərək istənilən məntiqi ifadələri yaza bilərsiniz: -and, -or, -xor, -not and! .. Onlar digər proqramlaşdırma dillərində olduğu kimi işləyir, siz isə qiymətləndirmə sırasını təyin etmək üçün mötərizələrdən istifadə edə bilərsiniz:

("Тест" -eq "Тест") -and (100 -eq 100)

-not (123 -gt 321) 

!(123 -gt 321)

Şərti atlama

PowerShell-də filial operatorları standartdır: ƏGƏR(ƏGƏR...ƏLSE, IF...ELSEIF...ƏKS) və SWITCH. Onların istifadəsinə misallarla baxaq:

[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 или значение не определено"}
}

Dövrlər

PowerShell-də bir neçə növ döngə var: WHILE, DO WHILE, DO UNTIL, FOR və FOREACH.

Ön şərti olan dövrə doğru olduğu müddətcə işləyir:

[int]$test = 0
while ($test -lt 10) {
      Write-Host $test
      $test = $test + 1
}

Postşərti olan döngələr ən azı bir dəfə işləyəcək, çünki şərt iterasiyadan sonra yoxlanılır. Eyni zamanda, şərt doğru olarkən DO WHILE işləyir və DO UNTIL yanlış olduqda işləyir:

[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əsinin təkrarlarının sayı əvvəlcədən məlumdur:

for ([int]$test = 0; $test -lt 10; $test++) {
       Write-Host $test
}

FOREACH döngəsində massiv və ya kolleksiyanın elementləri üzərində təkrarlanır (hesh cədvəli):

$test_collection = "item1", "item2", "item3"
foreach ($item in $test_collection)
{
        Write-Host $item
}

Diziler

PowerShell dəyişənləri təkcə tək obyektləri (rəqəm, sətir və s.) deyil, həm də çoxlu obyektləri saxlayır. Belə 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 boş ola bilər, yəni. elementləri ehtiva etmir. Bu, növbəti məqalədə bizə lazım olacaq @() operatorundan istifadə etməklə elan edilmişdir - massivə digər massivlərin əlavə edilməsi (çoxölçülü massivlərin yaradılması), massivlərin arqument kimi funksiyalara ötürülməsi və oxşar tapşırıqlar üçün çox vacibdir:

$test_array = @() #создаем пустой массив

Massiv işə salındıqda, onun dəyərləri vergüllə ayrılır (xüsusi operator ,):

$test_array = @(1, 2, 3, 4) # создаем массив из четырех элементов 

Əksər hallarda @() operatoru buraxıla bilər:

$test_array = 1, 2, 3, 4

Bu halda bir elementdən ibarət massiv aşağıdakı kimi işə salınır

$test_array = , 1

Massiv elementlərinə sıfır əsaslı tam indeks və indeks operatorundan (kvadrat mötərizə) istifadə etməklə daxil olur:

$test_array[0] = 1

Siz vergüllə ayrılmış bir neçə indeks təyin edə bilərsiniz, o cümlədən. təkrarlanan:

$test_array = "один", "два", "три", "четыре"
$test_array[0,1,2,3]
$test_array[1,1,3,3,0]

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

Operator .. (iki nöqtə - diapazon operatoru) göstərilən yuxarı və aşağı sərhədlər daxilində tam ədədlər massivini qaytarır. Məsələn, 1..4 ifadəsi @(1, 2, 3, 4) dörd elementdən ibarət massivi, 8..5 ifadəsi isə @(8, 7, 6, 5) massivi çıxarır.

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

Aralıq operatorundan istifadə edərək massivi işə sala bilərsiniz ($test_array = 1..4) və ya dilim (dilim), yəni. bir massivdən digərinin indeksləri ilə elementlərin ardıcıllığı. Bu halda mənfi rəqəm -1 massivin sonuncu elementini, -2 - sondan əvvəlki elementi və s.

$test_array = "один", "два", "три", "четыре"
$test_array[0..2]
$test_array[2..0]
$test_array[-1..0]
$test_array[-2..1]

Qeyd edək ki, tam ədəd massivinin dəyərləri məlumat massivinin maksimum indeks dəyərindən çox ola bilər. Bu halda, bütün dəyərlər sonuncuya qədər qaytarılır:

$test_array[0..100]

Tək mövcud olmayan massiv elementinə daxil olmağa cəhd etsəniz, $null qaytarılır.

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

PowerShell-də massivlər müxtəlif növ elementləri ehtiva edə və ya güclü şəkildə yazıla bilər:

$test_array = 1, 2, "тест", 3, 4
for ([int]$i = 0; $i -lt $test_array.count; $i++)
{
          Write-Host $test_array[$i]
}

Burada $test_array.count xassəsi massiv elementlərinin sayıdır.

Güclü tipli massiv yaratmaq nümunəsi:

[int[]]$test_array = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Hash cədvəlləri

PowerShell dilindəki digər əsas dəyişənlər assosiativ massivlər kimi də tanınan hash cədvəlləridir. Hashtables JSON obyektlərinə bənzəyir və açar-dəyər əsasında qurulur. Adi massivlərdən fərqli olaraq, onların elementlərinə obyektin xassələri olan adlı düymələr vasitəsilə daxil olur (həmçinin indeks operatorundan - kvadrat mötərizədə istifadə etmək olar).

@ simvolu və operator mötərizələrindən istifadə edərək boş bir hash cədvəli elan edilir:

$test_hashtable = @{}

Elan edərkən dərhal açarlar yarada və onlara dəyərlər təyin edə bilərsiniz:

$test_hashtable = @{one="один"; two="два"; three="три"; "some key"="some value"}

Hash cədvəlinə element əlavə etmək üçün ona hələ mövcud olmayan açar təyin etməli və ya Add () metodundan istifadə etməlisiniz. Mövcud açara tapşırıq verilirsə, onun dəyəri dəyişəcək. Remove() metodu hash cədvəlindən elementi silmək üçün istifadə olunur.

$test_hashtable."some key"
$test_hashtable["some key"]
$test_hashtable.Add("four", "четыре")
$test_hashtable.five = "пять"
$test_hashtable['five'] = "заменяем значение"
$test_hashtable.Remove("one")

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

Bu tip dəyişənlər funksiyalara və cmdletlərə arqumentlər kimi ötürülə bilər - növbəti məqalədə bunun necə edildiyini öyrənəcəyik və eyni zamanda başqa bir oxşar növü - PSCustomObject-i nəzərdən keçirəcəyik.

Funksiyalar

PowerShell-də funksiyalar da daxil olmaqla prosedur proqramlaşdırma üçün lazım olan hər şey var. Onları təsvir etmək üçün Function funksiya sözündən istifadə olunur, bundan sonra funksiyanın adını və operator mötərizəsinə daxil edilmiş gövdəsini göstərmək lazımdır. Əgər siz funksiyaya arqumentlər ötürməlisinizsə, onları mötərizədə addan dərhal sonra qeyd edə bilərsiniz.

function имя-функции (аргумент1, ..., аргументN) 
{ 
        тело-функции 
} 

Funksiya həmişə bir nəticə qaytarır - bu, birdən çox olduqda, bütün ifadələrinin nəticələrinin massividir. Yalnız bir ifadə varsa, müvafiq növün yeganə dəyəri qaytarılır. Qaytarma $value konstruksiyası nəticə massivinə $value dəyəri olan element əlavə edir və bəyanatlar siyahısının icrasını dayandırır, boş funksiya isə $null qaytarır.

Məsələn, ədədi kvadratlaşdırmaq üçün funksiya yaradaq:

function sqr ($number)
{
      return $number * $number
}

Qeyd edək ki, funksiyanın gövdəsində siz onu çağırmazdan əvvəl elan edilmiş istənilən dəyişənlərdən istifadə edə bilərsiniz və PowerShell-də funksiyaların çağırılması qeyri-adi görünə bilər: arqumentlər (əgər varsa) mötərizələrə alınmır və boşluqlarla ayrılır.

sqr 2

və ya belə:

sqr -number 2

Arqumentlərin ötürülmə üsuluna görə, funksiyanın özü bəzən mötərizələrə alınmalıdır:

function test_func ($n) {}
test_func -eq $null     # функция не вызывалась
(test_func) -eq $null   # результат выражения — $true

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

Funksiyanı təsvir edərkən arqumentlərə standart dəyərlər təyin edə bilərsiniz:

function func ($arg = value) {
         #тело функции
}

Funksiya arqumentlərini təsvir etmək üçün başqa bir sintaksis var, əlavə olaraq, parametrləri boru kəmərindən oxumaq olar - bütün bunlar ixrac edilmiş modullara baxdıqda və öz cmdletlərimizi yaratdıqda növbəti məqalədə faydalı olacaqdır.

Emal zamanı xəta

PowerShell-in istisnaları idarə etmək üçün Sınaq... Tut... Nəhayət mexanizmi var. Try blokunda xətanın baş verə biləcəyi kodu, Catch blokunda isə onun işləyicisi var. Səhv yox idisə, icra olunmur. Finally bloku Try blokundan sonra xətanın baş verməsindən asılı olmayaraq yerinə yetirilir və müxtəlif növ istisnalar üçün bir neçə Catch bloku ola bilər. İstisnanın özü elan edilməmiş standart dəyişənə ($_) yazılır və asanlıqla əldə edilə bilər. Aşağıdakı misalda biz yanlış dəyərin daxil edilməsindən qorunma həyata keçiririk:

try {

        [int]$test = Read-Host "Введите число"
        100 / $test

} catch {

         Write-Warning "Некорректное число"
         Write-Host $_

}

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

Bununla PowerShell dilində proqramlaşdırmanın əsaslarının nəzərdən keçirilməsi yekunlaşır. Növbəti məqalələrdə biz müxtəlif tipli dəyişənlərlə, kolleksiyalarla, müntəzəm ifadələrlə işləmək, funksiyalar, modullar və xüsusi cmdletlər yaratmaq, həmçinin obyekt yönümlü proqramlaşdırmanı daha ətraflı öyrənəcəyik.

Windows PowerShell nədir və nə ilə yeyilir? 2-ci hissə: Proqramlaşdırma dilinə giriş

Mənbə: www.habr.com

Добавить комментарий