Що таке 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   

-gt

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

$test = 100
$test -gt 123

-ge

Greater than or equal / Більше чи одно (аналог >=)

$test = 100
$test -ge 123

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

$test = 100
$test -lt 123  

-The

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

Додати коментар або відгук