Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

Историјски гледано, услужни програми командне линије на Уник системима су боље развијени него на Виндовс-у, али са појавом новог решења, ситуација се променила.

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

ПоверСхелл може бити скриптован у интерпретираном, вишепарадигмском језику који има елементе класичног процедуралног, објектно оријентисаног, па чак и функционалног програмирања: условно гранање, петље, променљиве, низови, хеш табеле, класе, руковање грешкама, као и функције, цмдлете и цевоводе . Претходни чланак је била посвећена основама рада у окружењу, а сада читаоцима нудимо мали водич за програмере.

Оглашение:

Коментари
Променљиве и њихови типови
Системске варијабле
Сцопес
Променљиве окружења (окружење)
Аритметички и оператори поређења
Оператори доделе
Логички оператори
Цондитионал Јумп
Циклуси
Арраис
Хеш табеле
Функције
Грешка у обради

Можете писати код у било ком уређивачу текста или користећи интегрисано развојно окружење – најлакши начин је да узмете Виндовс ПоверСхелл ИСЕ који долази са оперативним системима Мицрософт сервера. Ово је неопходно само за прилично сложене скрипте: кратке скупове команди је лакше извршити интерактивно.

Коментари

Коришћење коментара се сматра делом доброг стила програмирања, заједно са одговарајућим увлачењем и размаком:

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

<# 

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

#>

Променљиве и њихови типови

Променљиве у ПоверСхелл-у су именовани објекти. Њихова имена могу укључивати доњу црту, као и слова и бројеве. Симбол $ се увек користи испред имена, а да би се декларисала променљива, довољно је тумачу дати важеће име:

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

Да би се променљива иницијализовала (доделила јој вредност), користи се оператор доделе (симбол =):

$test = 100

Можете да декларишете променљиву тако што ћете навести њен тип у угластим заградама (оператор за пребацивање типа) пре имена или вредности:

[int]$test = 100

$test = [int]100

Важно је разумети да су променљиве у ПоверСхелл-у пуноправни објекти (класе) са својствима и методама чији су типови засновани на онима у .НЕТ Цоре. Наводимо главне:

Тип (.НЕТ класа)

Опис

Пример кода

[стринг] Систем.Стринг

Уницоде стринг 

$тест = "тест"
$тест = 'тест'

[цхар]Систем.Цхар

Уницоде знак (16 бита)

[цхар]$тест = 'ц'

[боол] Систем.Боолеан

логички тип (боолеан Тачно или Нетачно)

[боол]$тест = $труе

[инт] Систем.Инт32

тридесет два бита цео број (32 бита)

[инт]$тест = 123456789

[дуго] Систем.Инт64

шездесет четири бита цео број (64 бита)

[лонг]$тест = 12345678910

[сингле] Систем.Сингле

број са помичним зарезом дужине 32 бита

[сингле]$тест = 12345.6789

[доубле]Систем.Доубле

број са покретним зарезом дужине 64 бита (8 бајтова)

[доубле]$тест = 123456789.101112

[децимала]Систем.Децимал

128-битни број са помичним зарезом (треба да се завршава са д)

[децимални]$тест = 12345.6789д

[ДатеТиме]Систем.ДатеТиме

Датум и време 

$тест = ГетДате

[низ] Систем.Објекат[]

низ чији индекс елемента почиње од 0

$тест_арраи = 1, 2, "тест", 3, 4

[хасхтабле] Систем.Цоллецтионс.Хасхтабле

хеш табеле су асоцијативни низови са именованим кључевима, изграђени по принципу: @{кеи = "валуе"}

$тест_хасхтабле = @{оне="један"; тво="два"; три="три"}

ПоверСхелл подржава имплицитну конверзију типа, поред тога, тип променљиве се може променити у ходу (на пример, коришћењем оператора додељивања), ако није наведен на силу - у овом случају, тумач ће дати грешку. Можете одредити тип променљиве из претходног примера тако што ћете позвати метод ГетТипе():

$test.GetType().FullName

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

Постоји велики број цмдлет-а за манипулисање променљивим. Њихова листа у прикладном облику се приказује помоћу команде:

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

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

Да бисте видели декларисане променљиве и њихове вредности, можете користити посебну цмдлет:

Get-Variable | more

Овај метод делује претерано гломазан, много је згодније радити са променљивим преко оператора или директним приступом њиховим својствима и методама. Међутим, цмдлет-ови имају право да постоје јер вам омогућавају да подесите неке додатне параметре. Важно је разумети да су корисничке варијабле дефинисане само у оквиру тренутне сесије. Када се конзола затвори или се скрипта заврши, они се бришу.

Системске варијабле

Поред оних које је декларисао корисник, постоје уграђене (системске) променљиве које се не бришу након завршетка тренутне сесије. Они су подељени у два типа, док се подаци о стању ПоверСхелл-а чувају у аутоматским променљивим којима се не могу самостално доделити произвољне вредности. То укључује, на пример, $ПВД:

$PWD.Path

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

Променљиве преференција су потребне за чување корисничких преференција, чије вредности се могу мењати. На пример, коришћењем $ЕррорАцтионПреференце подешава се реакција тумача команди на појаву грешака које нису фаталне.

Поред оператора и цмдлет-а за приступ декларисаним променљивим, постоји и променљива: псеудоакумулатор. Можете радити са њим по аналогији са другим дисковима, а варијабле у овом случају подсећају на објекте система датотека:

Get-ChildItem Variable: | more

или

ls Variable: | more

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

Сцопес

За променљиве у ПоверСхелл-у постоји концепт опсега (Сцопе). Акција глобалног опсега (Глобал) се примењује на целу тренутну сесију - укључује, на пример, системске променљиве. Локалне (локалне) променљиве су доступне само у опсегу где су дефинисане: рецимо унутар функције. Постоји и концепт опсега скрипте (Сцрипт), али за команде скрипте он је у суштини локални. Подразумевано, када се декларишу променљиве, добијају локални опсег, а да бисте то променили, потребна вам је посебна конструкција као што је: $Глобал: променљива = вредност.

На пример, овако:

$Global:test = 100

Променљиве окружења (окружење)

Још један псеудо-диск, Енв:, доступан је од ПоверСхелл-а и може се користити за приступ променљивим окружења. Када се љуска покрене, они се копирају из надређеног процеса (то јест, из програма који је покренуо тренутну сесију) и обично су њихове почетне вредности исте као вредности на контролној табли. Да бисте видели променљиве окружења, користите цмдлет Гет-ЦхилдИтем или његове псеудониме (псеудониме): лс и дир.

dir Env:

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

Ове варијабле су низови бајтова (или знакова, ако желите), чија интерпретација зависи само од програма који их користи. *-Вариабле цмдлет команде не раде са променљивим окружења. Да бисте им приступили, морате да користите префикс диск јединице:

$env:TEST = "Hello, World!"

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

Аритметички и оператори поређења

ПоверСхелл обезбеђује следеће аритметичке операторе: + (сабирање), - (одузимање), * (множење), / (дељење) и % (по модулу или модулу). Резултат аритметичког израза се оцењује с лева на десно у складу са општеприхваћеним редоследом операција, а заграде се користе за груписање делова израза. Размаци између оператора се занемарују, користе се само да би се лакше читали. Оператор + такође спаја, а * оператор понавља низове. Ако покушате да додате број у низ, он ће бити конвертован у низ. Поред тога, ПоверСхелл језик има много оператора поређења који проверавају подударање између две вредности и враћају логички вредност Тачно или Нетачно:

Оператор

Опис

Пример кода

-ек

Једнако / Једнако (слично = или == на другим језицима)

$тест = 100
$тест -ек 123 

-не

Није једнако / Није једнако (слично <> или !=)

$тест = 100
$тест -не 123   

-гт

Веће од / Више (аналогно >)

$тест = 100
$тест -гт 123

-ге

Веће или једнако / Веће или једнако (слично >=)

$тест = 100
$тест -ге 123

-лт

Мање од / Мање (слично као <)

$тест = 100
$тест -лт 123  

-ле

Мање или једнако / Мање или једнако (слично као <=)

$тест = 100
$тест -ле 123

Постоје и други слични оператори који вам омогућавају да, на пример, упоредите стрингове на основу џокер знакова или користите регуларне изразе за подударање са шаблоном. Ми ћемо их детаљно покрити у будућим чланцима. Симболи <, > и = се не користе за поређење јер се користе у друге сврхе.

Оператори доделе

Поред најчешћег = оператора, постоје и други оператори доделе: +=, -=, *=, /= и %=. Они мењају вредност пре додељивања. Унарни оператори ++ и -, који повећавају или смањују вредност променљиве, понашају се слично - примењују се и на операторе доделе.

Логички оператори

Само поређење није довољно да опише сложене услове. Можете написати било које логичке изразе користећи операторе: -анд, -ор, -кор, -нот анд! .. Они раде као у другим програмским језицима, док можете користити заграде да одредите редослед евалуације:

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

-not (123 -gt 321) 

!(123 -gt 321)

Цондитионал Јумп

Оператори гранања у ПоверСхелл-у су стандардни: ИФ(ИФ…ЕЛСЕ, ИФ…ЕЛСЕИФ…ЕЛСЕ) и СВИТЦХ. Погледајмо њихову употребу на примерима:

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

Циклуси

ПоверСхелл има неколико варијанти петљи: ВХИЛЕ, ​​ДО ВХИЛЕ, ​​ДО УНТИЛ, ФОР и ФОРЕАЦХ.

Петља са предусловом ради ако/све док је тачно:

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

Петље са постусловом ће се покренути најмање једном, јер се услов проверава након итерације. У исто време, ДО ВХИЛЕ ради док је услов истинит, а ДО УНТИЛ ради док је нетачан:

[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 ([int]$test = 0; $test -lt 10; $test++) {
       Write-Host $test
}

У ФОРЕАЦХ петљи, понавља се преко елемената низа или колекције (хеш табела):

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

Арраис

ПоверСхелл променљиве чувају не само појединачне објекте (број, стринг, итд.), већ и више објеката. Најједноставнија врста таквих променљивих су низови. Низ се може састојати од више елемената, једног елемента, или бити празан, тј. не садрже елементе. Декларише се помоћу оператора @() који ће нам требати у следећем чланку – веома је важан за додавање других низова у низ (креирање вишедимензионалних низова), прослеђивање низова функцијама као аргумент и сличне задатке:

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

Када се низ иницијализује, његове вредности су наведене одвојене зарезима (посебан оператор ,):

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

У већини случајева, @() оператор се може изоставити:

$test_array = 1, 2, 3, 4

У овом случају, низ од једног елемента се иницијализује на следећи начин

$test_array = , 1

Елементима низа се приступа коришћењем целобројног индекса заснованог на нули и оператора индекса (угласте заграде):

$test_array[0] = 1

Можете навести неколико индекса одвојених зарезима, укљ. понављајући:

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

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

Оператор .. (две тачке - оператор опсега) враћа низ целих бројева унутар наведених горњих и доњих граница. На пример, израз 1..4 даје низ од четири елемента @(1, 2, 3, 4), а израз 8..5 даје низ @(8, 7, 6, 5).

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

Користећи оператор опсега, можете иницијализовати низ ($тест_арраи = 1..4) или добити исечак (слице), тј. низ елемената из једног низа са индексима из другог. У овом случају, негативан број -1 означава последњи елемент низа, -2 - претпоследњи и тако даље.

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

Имајте на уму да вредности низа целих бројева могу бити веће од максималне вредности индекса низа података. У овом случају, све вредности се враћају до последње:

$test_array[0..100]

Ако покушате да приступите једном непостојећем елементу низа, враћа се $нулл.

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

У ПоверСхелл-у, низови могу да садрже елементе различитих типова или да буду снажно откуцани:

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

Где је својство $тест_арраи.цоунт број елемената низа.

Пример креирања јако укуцаног низа:

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

Хеш табеле

Други основни тип променљивих у ПоверСхелл језику су хеш табеле, такође познате као асоцијативни низови. Хеш табеле су сличне ЈСОН објектима и изграђене су на основу кључ-вредност. За разлику од обичних низова, њиховим елементима се приступа преко именованих кључева, који су својства објекта (можете користити и оператор индекса – угласте заграде).

Празна хеш табела је декларисана помоћу симбола @ и операторских заграда:

$test_hashtable = @{}

Приликом декларисања, можете одмах креирати кључеве и доделити им вредности:

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

Да бисте додали елемент у хеш табелу, морате да јој доделите кључ који још не постоји или да користите метод Адд (). Ако се додељује постојећем кључу, његова вредност ће се променити. Метод Ремове() се користи за уклањање елемента из хеш табеле.

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

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

Променљиве овог типа могу се прослеђивати као аргументи функцијама и цмдлетима - у следећем чланку ћемо проучити како се то ради, а такође ћемо размотрити још један сличан тип - ПСЦустомОбјецт.

Функције

ПоверСхелл има све што вам је потребно за процедурално програмирање, укључујући функције. Да би се они описали, користи се реч функције Функција, након чега треба да наведете назив функције и тело затворено у операторске заграде. Ако треба да проследите аргументе функцији, можете их навести одмах иза имена у заградама.

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

Функција увек враћа резултат – то је низ резултата свих њених исказа, ако их има више. Ако постоји само један исказ, враћа се једина вредност одговарајућег типа. Повратна конструкција $валуе додаје елемент са вредношћу $валуе низу резултата и прекида извршење листе исказа, а празна функција враћа $нулл.

На пример, направимо функцију за квадрирање броја:

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

Имајте на уму да у телу функције можете да користите све променљиве које су декларисане пре него што је позовете, а позивање функција у ПоверСхелл-у може изгледати необично: аргументи (ако их има) нису затворени у заградама и раздвојени су размацима.

sqr 2

или тако:

sqr -number 2

Због начина на који се аргументи прослеђују, сама функција понекад треба да буде затворена у заградама:

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

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

Када описујете функцију, можете доделити подразумеване вредности аргументима:

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

Постоји још једна синтакса за описивање аргумената функције, поред тога, параметри се могу читати из цевовода - све ово ће нам добро доћи у следећем чланку, када погледамо извезене модуле и креирамо сопствене цмдлете.

Грешка у обради

ПоверСхелл има механизам Три...Цатцх...Финали за руковање изузецима. Блок Три садржи код у којем може доћи до грешке, а блок Цатцх садржи свој руковалац. Ако није било грешке, она се не извршава. Блок Финалли се извршава након блока Три, без обзира на појаву грешке, а може постојати неколико Цатцх блокова за различите типове изузетака. Сам изузетак је уписан у недекларисану подразумевану променљиву ($_) и може се лако преузети. У примеру у наставку примењујемо заштиту од уноса неважеће вредности:

try {

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

} catch {

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

}

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

Овим је завршен преглед основа програмирања у ПоверСхелл језику. У наредним чланцима ћемо детаљније проучити рад са варијаблама различитих типова, колекцијама, регуларним изразима, креирање функција, модула и прилагођених цмдлет-а, као и објектно оријентисано програмирање.

Шта је Виндовс ПоверСхелл и са чиме се једе? Део 2: Увод у програмски језик

Извор: ввв.хабр.цом

Додај коментар