Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

Гістарычна ўтыліты каманднага радка ў Unix-сістэмах развіты лепш чым у Windows, аднак са з'яўленнем новага рашэння сітуацыя змянілася.

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

Для PowerShell можна пісаць сцэнары на інтэрпрэтаванай мультыпарадыгменнай мове, у якой ёсць элементы класічнага працэдурнага, аб'ектна-арыентаванага і нават функцыянальнага праграмавання: умоўны пераход, цыклы, зменныя, масівы, хэш-табліцы, класы, апрацоўка памылак, а таксама функцыі, камандлеты і канвееры . Папярэдні тэкст была прысвечана асновам працы ў асяроддзі, а зараз мы прапануем увазе чытачоў невялікі даведнік для праграмістаў.

змест:

Каментары
Пераменныя і іх тыпы
Сістэмныя зменныя
Вобласці бачнасці
Пераменныя асяроддзі (асяроддзі)
Арыфметычныя аператары і аператары параўнання
Аператары прысвойвання
Лагічныя аператары
Умоўны пераход
цыклы
Масівы
Хэш-табліцы
функцыі
Апрацоўка памылак

Пісаць код можна ў любым тэкставым рэдактары або з выкарыстаннем інтэграванага асяроддзя распрацоўкі - прасцей за ўсё ўзяць Windows PowerShell ISE з камплекта пастаўкі серверных аперацыйных сістэм Microsoft. Трэба гэта толькі для дастаткова складаных скрыптоў: кароткія наборы каманд прасцей выконваць у інтэрактыўным рэжыме.

Каментары

Выкарыстанне каментароў лічыцца часткай добрага стылю праграмавання нараўне з правільнымі водступамі і прабеламі:

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

<# 

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

#>

Пераменныя і іх тыпы

Зменныя ў PowerShell - гэта найменныя аб'екты. Іх назвы могуць уключаць сімвал падкрэслення, а таксама літары і лікі. Перад імем заўсёды выкарыстоўваецца сімвал $, а каб абвясціць зменную, дастаткова ўказаць інтэрпрэтатару дапушчальнае імя:

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

Для ініцыялізацыі зменнай (прысваення ёй значэння) прымяняецца аператар прысвойвання (знак =):

$test = 100

Абвясціць зменную можна з указаннем яе тыпу ў квадратных дужках (аператар прывядзення тыпаў) перад імем або значэннем:

[int]$test = 100

$test = [int]100

Важна разумець, што зменныя ў PowerShell – гэта паўнавартасныя аб'екты (класы) са ўласцівасцямі і метадамі, тыпы якіх заснаваныя на наяўных у. NET Core. Пералічоны асноўныя:

Тып (клас .NET)

Апісанне

Прыклад кода

[string] System.String

радок Unicode 

$test = "тэст"
$test = 'тэст'

[char] System.Char

сімвал Unicode (16 біт)

[char]$test = 'c'

[bool] System.Boolean

булеўскі тып (лагічнае значэнне True або False)

[bool]$test = $true

[int] System.Int32

трыццацідвухразрадны цэлы лік (32 біта)

[int]$test = 123456789

[long] System.Int64

шасцідзесяцічатырохразрадны цэлы лік (64 біта)

[long]$test = 12345678910

[single] System.Single

лік з якая плавае кропкай даўжынёю ў 32 біта

[single]$test = 12345.6789

[double] System.Double

лік з якая плавае кропкай даўжынёю ў 64 біта (8 байт)

[double]$test = 123456789.101112

[decimal] System.Decimal

лік з якая плавае кропкай даўжынёю ў 128 біт (абавязкова паказваць d на канцы)

[decimal]$test = 12345.6789d

[DateTime] System.DateTime

дата і час 

$test = Get-Date

[array] System.Object[]

масіў, індэкс элементаў якога пачынаецца з 0

$test_array = 1, 2, "тэст", 3, 4

[hashtable] System.Collections.Hashtable

хэш-табліцы - асацыятыўныя масівы з найменнымі ключамі, пабудаваныя па прынцыпе: @ {ключ = "значэнне"}

$test_hashtable = @{one=«адзін»; two=«два»; three=«тры»}

PowerShell падтрымлівае няяўнае пераўтварэнне тыпаў, акрамя таго тып зменнай можа мяняцца на хаду (напрыклад, пры дапамозе аператара прысвойвання), калі ён не пазначаны прымусова – у гэтым выпадку інтэрпрэтатар выдасць памылку. Вызначыць тып зменнай з папярэдняга прыкладу можна пры дапамозе выкліку метаду GetType():

$test.GetType().FullName

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

Існуе некаторую колькасць камандлетаў для кіравання зменнымі. Іх спіс у зручнай форме выводзіцца з дапамогай каманды:

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

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

Для прагляду абвешчаных зменных і іх значэнняў можна выкарыстоўваць спецыяльны камандлет:

Get-Variable | more

Такі спосаб здаецца празмеру грувасткім, са зменнымі нашмат зручней працаваць праз аператары ці звяртаючыся да іх уласцівасцяў і метадаў напроста. Тым не менш, камандлеты маюць права на існаванне, паколькі дазваляюць задаць некаторыя дадатковыя параметры. Важна разумець, што карыстацкія зменныя вызначаны толькі ў рамках бягучага сеанса. Пасля зачынення кансолі ці завяршэнні сцэнара яны выдаляюцца.

Сістэмныя зменныя

Апроч абвешчаных карыстачом існуюць убудаваныя (сістэмныя) зменныя, якія не выдаляюцца пасля завяршэння бягучага сеансу. Падзяляюцца яны на два тыпу, пры гэтым дадзеныя аб стане PowerShell захоўваюцца ў аўтаматычных зменных, якім нельга самастойна прысвоіць адвольныя значэнні. Да іх ліку адносіцца, напрыклад, $PWD:

$PWD.Path

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

Для захоўвання карыстацкіх налад патрэбны зменныя пераваг, значэнні якіх можна змяніць. Напрыклад, з дапамогай $ErrorActionPreference задаецца рэакцыя інтэрпрэтатара каманд на ўзнікненне некрытычных памылак.

У дадатак да аператараў і камандлетам для звароту да абвешчаных зменных існуе псеўданазапашвальнік Variable:. Працаваць з ім можна па аналогіі з іншымі назапашвальнікамі, а зменныя ў гэтым выпадку нагадваюць аб'екты файлавай сістэмы:

Get-ChildItem Variable: | more

або

ls Variable: | more

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

Вобласці бачнасці

Для зменных у PowerShell існуе паняцце вобласці бачнасці (Scope). Дзеянне глабальнай вобласці (Global) распаўсюджваецца на ўвесь бягучы сеанс - у яе ўваходзяць, напрыклад, сістэмныя зменныя. Лакальныя (Local) зменныя даступныя толькі ў вобласці, дзе яны былі вызначаны: скажам усярэдзіне функцый. Ёсць яшчэ паняцце вобласці дзеяння сцэнара (Script), але для каманд скрыпту яна па ісце з'яўляецца лакальнай. Па змаўчанні пры аб'яве зменных ім задаецца лакальная вобласць дзеяння, а каб гэта змяніць, патрэбна адмысловая канструкцыя выгляду: $Global: зменная = значэнне.

Напрыклад, так:

$Global:test = 100

Пераменныя асяроддзі (асяроддзі)

З PowerShell даступны яшчэ адзін псеўданазапашвальнік Env:, з дапамогай якога можна звярнуцца да зменных асяроддзі. Пры запуску абалонкі яны капіююцца з бацькоўскага працэсу (г.зн. з якая ініцыявала бягучы сеанс праграмы) і звычайна іх першапачатковыя значэнні супадаюць са значэннямі ў панэлі кіравання. Для прагляду зменных асяроддзі выкарыстоўваецца камандлет Get-ChildItem або яго псеўданімы (аліясы): ls і dir.

dir Env:

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

Гэтыя зменныя ўяўляюць сабой паслядоўнасці байтаў (ці знакаў, калі заўгодна), інтэрпрэтацыя якіх залежыць толькі ад выкарыстоўвалай іх праграмы. Камандлеты *-Variable са зменнымі асяроддзі не працуюць. Каб звярнуцца да іх, давядзецца выкарыстоўваць прэфікс дыска:

$env:TEST = "Hello, World!"

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

Арыфметычныя аператары і аператары параўнання

У PowerShell ёсць наступныя арыфметычныя аператары: + (складанне), - (адніманне), * (множанне), / (дзяленне) і % (модуль або рэшту ад дзялення). Вынік арыфметычнага выраза вылічаецца злева направа ў адпаведнасці з агульнапрынятым парадкам аперацый, а для групоўкі частак выраза прымяняюцца круглыя ​​дужкі. Прабелы паміж аператарамі ігнаруюцца, іх выкарыстоўваюць толькі для палягчэння ўспрымання. Аператар + таксама аб'ядноўвае, а аператар * паўтарае радкі. Пры спробе дадаць лік да радка яно будзе пераўтворана ў радок. Акрамя таго, у мове PowerShell ёсць мноства аператараў параўнання, якія правяраюць адпаведнасць паміж двума значэннямі і вяртаюць лагічныя True ці False:

Аператар

Апісанне

Прыклад кода

-экв

Equal / Роўна (аналаг = ці == у іншых мовах)

$test = 100
$test -eq 123 

-не

Not equal / Не роўна (аналаг <> або !=)

$test = 100
$test -ne 123   

-гт

Greater than / Больш (аналаг >)

$test = 100
$test -gt 123

-ге

Greater than or equal / Больш ці роўна (аналаг >=)

$test = 100
$test -ge 123

-LT

Less than / Менш (аналаг <)

$test = 100
$test -lt 123  

-ле

Less than or equal / Менш ці роўна (аналаг <=)

$test = 100
$test -le 123

Існуюць і іншыя падобныя аператары, якія дазваляюць, напрыклад, параўноўваць радкі з улікам знака падстаноўкі або выкарыстоўваць рэгулярныя выразы для пошуку адпаведнасці ўзоры. Іх мы падрабязна разгледзім у наступных артыкулах. Сімвалы <, > і = для параўнання не выкарыстоўваюцца, паколькі задзейнічаны для іншых мэт.

Аператары прысвойвання

Апроч самага распаўсюджанага аператара = існуюць і іншыя аператары прысвойвання: +=, -=, *=, /= і %=. Яны змяняюць значэнне перад прысваеннем. Аналагічна паводзяць сябе ўнарныя аператары ++ і –, якія павялічваюць або памяншаюць значэнне зменнай – яны таксама ставяцца да аператараў прысвойвання.

Лагічныя аператары

Для апісання складаных умоў аднаго толькі параўнання недастаткова. Запісаць любыя лагічныя выразы можна з дапамогай аператараў: -and, -or, -xor, -not і!.. Працуюць яны як і ў іншых мовах праграмавання, пры гэтым можна выкарыстоўваць круглыя ​​дужкі, каб задаць парадак вылічэння:

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

-not (123 -gt 321) 

!(123 -gt 321)

Умоўны пераход

Аператары галінавання ў PowerShell стандартныя: IF(IF…ELSE, IF…ELSEIF…ELSE) і SWITCH. Разгледзім іх выкарыстанне на прыкладах:

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

цыклы

У мове PowerShell ёсць некалькі разнавіднасцяў цыклаў: WHILE, DO WHILE, DO UNTIL, FOR і FOREACH.

Цыкл з прадумовай працуе, калі/пакуль яно выконваецца:

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

Цыклы з паставай адпрацуюць хаця б адзін раз, таму што праверка ўмовы адбываецца пасля выканання ітэрацыі. Пры гэтым DO WHILE працуе, пакуль умова праўдзіва, а DO UNTIL - пакуль яно ілжыва:

[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 вядома загадзя:

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

У цыкле FOREACH ажыццяўляе перабор элементаў масіва ці калекцыі (хэш-табліцы):

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

Масівы

У зменных PowerShell захоўваюцца не толькі адзінкавыя аб'екты (лік, радок і г.д.), але і множныя. Самы просты разнавіднасць такіх зменных - масівы. Масіў можа складацца з некалькіх элементаў, з аднаго элемента ці быць пустым, г.зн. не змяшчаць элементаў. Для яго аб'явы выкарыстоўваецца аператар @(), які спатрэбіцца нам у наступным артыкуле - ён вельмі важны для дадання ў масіў іншых масіваў (стварэння шматмерных масіваў), перадачы масіваў у функцыі ў якасці аргументу і таму падобных задач:

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

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

Аператар .. (дзве кропкі - аператар дыяпазону) вяртае масіў цэлых лікаў на вызначаным верхняй і ніжняй мяжой адрэзку. Напрыклад, выраз 1..4 выводзіць масіў з чатырох элементаў @(1, 2, 3, 4), а выраз 8..5 - масіў @(8, 7, 6, 5).

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

З дапамогай аператара дыяпазону можна ініцыялізаваць масіў ($test_array = 1..4) або атрымаць зрэз (slice), г.зн. паслядоўнасць элементаў аднаго масіва з азначнікамі з іншага. Пры гэтым адмоўны лік -1 пазначае апошні элемент масіва, -2 - перадапошні і г.д.

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

Звярніце ўвагу, што значэнні цэлалікавага масіва могуць быць большымі за максімальнае значэнне індэкса масіва з дадзенымі. У гэтым выпадку вяртаюцца ўсе значэнні да апошняга:

$test_array[0..100]

Калі паспрабаваць звярнуцца да адзінага неіснуючага элемента масіва, вяртаецца значэнне $null.

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

У PowerShell масівы могуць утрымоўваць элементы розных тыпаў ці быць строга тыпізаванымі:

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

Дзе ўласцівасць $test_array.count - колькасць элементаў масіва.

Прыклад стварэння строга тыпізаванага масіва:

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

Хэш-табліцы

Яшчэ адзін базавы тып зменных у мове PowerShell - хэш-табліцы, якія таксама называюць асацыятыўнымі масівамі. Hashtable падобныя на JSON object і будуюцца па прынцыпе ключ-значэнне. У адрозненне ад звычайных масіваў, доступ да іх элементаў ажыццяўляецца па найменных ключах, якія з'яўляюцца ўласцівасцямі аб'екта (таксама можна выкарыстоўваць аператар азначніка - квадратныя дужкі).

Пустая хэш-табліца аб'яўляецца з дапамогай службовага знака @ і аператарных дужак:

$test_hashtable = @{}

Пры аб'яве можна адразу стварыць ключы і прысвоіць ім значэння:

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

Для дадання элемента ў хэш-табліцу трэба прысвоіць ёй яшчэ неіснуючы ключ ці скарыстацца метадам Add(). Калі прысвойванне робіцца з існуючым ключом, яго значэнне зменіцца. Для выдалення элемента з хэш-табліцы выкарыстоўваецца метад Remove().

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

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

Зменныя гэтага тыпу можна перадаваць у якасці аргументаў функцый і камандлетам – у наступным артыкуле мы вывучым як гэта робіцца, а таксама разгледзім яшчэ адзін падобны тып – PSCustomObject.

функцыі

У мове PowerShell ёсць усе неабходныя для працэдурнага праграмавання элементы, у тым ліку функцыі. Для іх апісання выкарыстоўваецца службовае слова Function, пасля якога патрабуецца пазначыць імя функцыі і заключанае ў аператарныя дужкі цела. Пры неабходнасці перадаць у функцыю аргументы іх можна паказаць адразу пасля імя ў круглых дужках.

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

Функцыя заўсёды вяртае вынік - гэта масіў вынікаў усіх яе стэйтментаў, калі іх больш за аднаго. Калі стэйтмент адзін, вяртаецца адзінае значэнне адпаведнага тыпу. Канструкцыя return $value дадае элемент са значэннем $value да масіва вынікаў і перарывае выкананне statement list, а пустая функцыя вяртае $null.

Для прыкладу створым функцыю ўзвядзення ліку ў квадрат:

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

Адзначым, што ў целе функцыі можна выкарыстоўваць любыя абвешчаныя да яе выкліку зменныя, а выклік функцый у PowerShell можа здацца нязвыклым: аргументы (калі яны ёсць) не складаюцца ў круглыя ​​дужкі і падзяляюцца прабеламі.

sqr 2

ці так:

sqr -number 2

З-за спосабу перадачы аргументаў саму функцыю часам даводзіцца складаць у дужкі:

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

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

Пры апісанні функцыі можна прысвоіць аргументам значэння па змаўчанні:

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

Існуе і іншы сінтаксіс для апісання аргументаў функцыі, акрамя таго параметры могуць счытвацца з канвеера - усё гэта спатрэбіцца ў наступным артыкуле, калі мы будзем разглядаць экспартуемыя модулі і стварэнне ўласных камандлетаў.

Апрацоўка памылак

У PowerShell існуе механізм Try…Catch…Finally, які дазваляе апрацоўваць выключныя сітуацыі. У блок Try змяшчаецца код, у якім можа ўзнікнуць памылка, а ў блок Catch - яе апрацоўшчык. Калі памылкі не было, ён не выконваецца. Блок Finally выконваецца пасля блока Try па-за залежнасцю ад узнікнення памылкі, а блокаў Catch можа быць некалькі для выключэнняў розных тыпаў. Само выключэнне запісваецца ў не якая патрабуе аб'явы зменную па змаўчанні ($_) і можа быць лёгка вынята. У прыкладзе ніжэй мы рэалізуем абарону ад уводу некарэктнага значэння:

try {

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

} catch {

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

}

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

На гэтым разгляд асноў праграмавання на мове PowerShell варта скончыць. У наступных артыкулах мы падрабязней вывучым працу са зменнымі розных тыпаў, калекцыі, рэгулярныя выразы, стварэнне функцый, модуляў і ўласных камандлетаў, а таксама аб'ектна-арыентаванае праграмаванне.

Што такое Windows PowerShell і з чым яго ядуць? Частка 2: увядзенне ў мову праграмавання

Крыніца: habr.com

Дадаць каментар