__TOC__

Powershell - мова не чутлива до регістру. for, FOR, FoR, fOr - йому все одно.

Командна оболонка Команди Powershell можна виконувати в своїй командній оболонці, подібній до cmd.exe, а можна в середовищі що називається Powershell ISE, і постачається разом з Powershell 2.0 та вище.

Коментарі В PowerShell, все в рядку що знаходиться справа від символу "дієз" буде вважатись коментарем.

це код # це коментар # цей ввесь рядок - коментар

У версіях PowerShell більших за 2.0 (а це майже всі версії) можна використовувати блоковий коментар

це код <# а це - коментар #> і знову код. <# а тут взагалі кожен рядок - коментар #>

Командлети Команди Powershell називаються командлетами і складаються з двох частин розділених дефісом - дієслова та об’єкта. Наприклад командлет що дозволяє отримати список всіх доступних командлетів:

Get-Command -commandType cmdlet

Можна отримати інформацію про командлет використовуючи командлет Get-HelpGet-Help, після якого вказавши назву командлета. Get-Help Get-Command дозволяє отримати всі розділи довідки.

Командлети мають параметри які дозволяють їм отримати додаткову інформацію про те що і як потрібно робити. Параметри бувають порядкові, іменовані та перемикачі.

Наприклад команда Get-ChildItemGet-ChildItem, яка перелічує дітей вузла якоїсь деревовидної структури (наприклад вміст каталогу файлової системи), має параметри: -path - іменований а також порядковий (перший) параметр що вказує чиїх дітей треба перелічити (наприклад Get-ChildItem C:\. -recurse - перемикач який дозволяє вказати командлету що треба також повернути дітей дітей.

Псевдоніми Якщо ви постійно працюєте в PowerShell, то щоразу набирати Get-ChildItem буде дуже втомливо, тому для неї створені такі псевдоніми як ls та dir.

Список доступних псевдонімів можна отримати командою ls alias: (отримати вміст віртуального диска alias) або Get-Alias.

Створити новий псевдонім можна за допомогою команди Set-Alias, наприклад:

Set-Alias np notepad.exe

Видалити псевдонім np:

Remove-Item alias:\np

Змінні Змінні, як і все інше в PowerShell нечутливі до регістру. Назва змінної може містити що завгодно, але якщо вона міститиме символи що можуть неоднозначно сприйнятись (наприклад прогалики) то її потрібно помістити в фігурні дужки. Кожна змінна позначається знаком долара ($) за яким йде її назва.

Змінні створюються при першому присвоєнні, наприклад:

$a = $b = 0 # присвоїти обом нуль $a , $b = 2, 3 # $а буде 2, а $b - 3

Отримати список всіх наявних змінних можна за допомогою команди ls variable: (отримати вміст віртуального диска variable) або Get-Variable.

Щоб перевірити існування змінної $a можна так: Test-Path variable:\a

Константи Окрім звичайного присвоєння, змінну можна створити за допомогою командлета New-Variable, що дозволяє передати їй деякі додаткові параметри, наприклад вказати режим лише для читання:

New-Variable -Name pi -Value 3.1415926 -Option ReadOnly

Щоб видалити константу, доведеться передати в Remove-Item ключ -Force.

Змінні середовища Щоб отримати доступ до змінних середовища, використовують префікс env:, наприклад $env:path.

Щоправда кожен скрипт має свою копію набору змінних середовища, тому зміна їх значень призводить лише до змін всередині скрипта. Якщо ви захочете змінити змінну середовища на довший термін для користувача чи для всієї системи - використайте фукнцію

[environment]::SetEnvironmentVariable("path", $new_value, "user")

де перший параметр - назва змінної, другий - значення, а третій - "user", якщо змінну треба встановити для користувача, і "machine" - якщо для всієї машини.

Інші цікаві змінні Змінні виду ${C:\path\to.file} дозволяють отримати доступ до файлів.

Підстановка в рядки Якщо рядок записується в подвійних лапках, то в нього можна підставляти вирази та змінні PowerShell.

Щоб підставити в рядок змінну $x пишуть "Значення x: $x".

Вираз можна підставити в рядок, якщо помістити його в дужки перед якими поставити знак долара. Це називають прямою змінною (direct variable), бо її значення визначається її "іменем". Наприклад:

"$(2+2)" - дасть на виході "4".

Натомість '$(2+2)' - так і буде '$(2+2)'.

Типи Також, кожній змінній можна задати тип (хоча це не обов’язково), написавши його назву перед її оголошенням в квадратних дужках. Змінна маючи пов’язаний тип, буде намагатись привести значення які їй присвоюють до вказаного типу. Наприклад:

[bool]$x = $True $x = 0 # x дорівнюватиме $False

Можливі також складніші приведення: [datetime]$date = '2014.04.01 12:45"

Щоб визначити тип змінної, викличте її метод GetType: $date.GetType().Name

Щоб визначити приналежність змінної типу, можна використати оператор -is, наприклад: "hello" -is [string] # True

Стрічки $env:path - це стрічка що містить шляхи до програм розділені двокрапкою. Її можна перевторити на список стрічок, викликавши метод split():

$env:path.split(';')

Інші корисні командлети Start-Sleep -s $seconds -m $miliseconds - призупиняє виконання скрипта на $seconds секунд, або $miliseconds мілісекунд.Start-Sleep Clear-Host - очищає консоль.Clear-Host

Масиви Масиви - це змінні типу [array]. Багато команд в PowerShell повертають в результаті своєї роботи саме масиви. Наприклад:

$a = ipconfig $a -is [array] # True

Як і в інших мовах програмування, отримати доступ до елементу масиву можна за допомогою квадратних дужок, при цьому нумерація починається з нуля:

$a # отримати ДРУГИЙ елемент масиву

$a.Count, або $a.Length - кількість елементів масиву.

Таким чином отримати останній елемент масиву можна наступним чином: $a[$a.Count - 1]. Але є й простіший спосіб: $a[-1]. Це нагадує мову Python.

Масив можна створити перелічивши елементи через кому:

# елементи не обов’язково повинні мати однакові типи $a = 1, 2, 3, "hello", "world"

або задавши як діапазон: $a = 1..4

Порожній, та масив з одного елемента створюються за допомогою @() та @($element) відповідно.

І хоча масиви в PowerShell, як і в інших динамічних мовах програмування гетерогенні, тобто можуть містити елементи будь-якого типу, можна задати типізований масив, який зможе містити лише елементи певного типу, наприклад: [int[]]$a = 1, 2

Хеші Хеші, або асоціативні масиви - це масиви, індексами яких можуть виступати не тільки числа, а довільні значення. Записуються парами ключ-значення, розліленими крапкою з комою і поміщеними фігурні дужки, перед якими стоїть "собачка":

$user = @{name="admin"; id=1;}

Отримати значення за ключем можна кількома способами:

$user['name'] $user.name

$key = 'name' # назва ключа $user[$key] $user.$key # те саме що $user.name, бо $key містить таке значення

$user.keys - масив всіх ключів хеша. Значення за ключами можна отримувати не по одному, а зразу цілим масивом, якщо попросити масив ключів: $user[$user.keys] - всі значення хеша.

Щоб додати новий ключ в хеш, достатньо зробити присвоєння:

$user.date = Get-Date

$user.keys містить всі ключі хеша, а всі значення можна отримати за допомогою виразу $user[$user.keys].

Таким чином ми можемо передавши масив ключів отримувати масив значень:

$NATO = @{ "A" = "Alpha"; "B" = "Bravo"; # ... "Z" = "Zulu"; } $NATO[([string[]]"BUNYK".ToCharArray())] # дає: Bravo, Uniform, November, Yankee, Kilo

Як і в Python, хеші та масиви передаються за посиланням а не за значенням, тобто можлива така помилка:

$user1 = @{ name = 'Taras' }

$user2 = $user1 $user2.name = 'Oleg'

Write-Host $user1.name # теж змінено на Oleg

Щоб цього уникнути, використовують метод Clone(): $user1 = @{ name = 'Taras' }

$user2 = $user1.Clone() $user2.name = 'Oleg'

Write-Host $user1.name # тепер 'Taras', як і було.

Труби Powershell дозволяє передавати вихід однієї команди на вхід іншої, за допомогою оператора "|" (труба). Типові командлети що вміють обробляти послідовність: Format-Table - форматує вивід як таблицю. При цьому може приймати список атрибутів для колонок таблиці, або скриптблокFormat-Table

PS C:\Users\tbunyk> ls | Select-Object -first 1 | Format-Table

Directory: C:\Users\tbunyk

Mode LastWriteTime Length Name

d---- 10.06.2013 13:17 .cache

Format-List - форматує кожен об’єкт у вигляді списку пар атрибут-значення, розділених двокрапкою.Format-List

PS C:\Users\tbunyk> ls | Select-Object -first 1 | Format-List

Directory: C:\Users\tbunyk

Name : .cache CreationTime : 10.06.2013 11:40:39 LastWriteTime : 10.06.2013 13:17:42 LastAccessTime : 10.06.2013 13:17:42

Where-Object (також має псевдонім (?) - приймає як параметр скриптблок, і повертає лише ті об’єкти для яких умова описана в тому скриптблоці повертає істину. Наприклад 1..10 | Where-Object { $_ -lt 5 } - лише числа менші 5. Where-Object ForEach-Object (також має псевдонім (%) - приймає як параметр скриптблок, і повертає результати виконання скриптблока до кожного об’єкта що передається в трубу (до якого всередині скриптблоку звертаються як $_). ForEach-Object Select-Object - приймає послідовність об’єктів, і повертає послідовність об’єктів, при цьому залишаючи лише ті атрибути, які були вказані в його параметрах. Також може приймати параметри -Fist $N, що вказує повертати тільки перших N об’єктів, та -Last $N, що поверне лише останніх N об’єктів.Select-Object

Out-File, або > - перенаправляє вивід командлета в файл.Out-File Out-Null - перенаправляє вивід в нікуди. Може знадобитись наприклад для того аби приховати вивід зайвих даних скриптом.Out-Null Out-Host - виводить дані в термінал. Має параметр -paging, що дозволяє посторінково виводити дані. (Як more в Unix)Out-Host Out-String - виводить дані в рядок. Out-String

Умовні оператори В Powershell є два види умовних операторів: if та switch. І ще є фільтр Where-Object, але це просто командлет, а не конструкція мови.

Оператор if: if (умова) { зробити щось; } elseif (інша умова) { зробити щось інше; } else { зробити хоч щось; }

Оператор switch: $value = "Close"; switch -case ($value) { "open" { Write-Host "Opening.." } "close" { Write-Host "Closing.." } default { Write-Host "Don't know how to $value" } } Завдяки ключу -case, порівняння буде чутливим до регістру, і ми отримаємо на виході:

Don't know how to Close

Якщо його забрати - порівняння буде ігнорувати регістр в рядків. Для нерядкових змінних цей ключ не має сенсу.

Ключ -wildcard дозволяє робити порівняння з маскою. switch -wildcard ($value) { "*@gmail.com" { Write-Host "Gmail" } "*@ukr.net" { Write-Host "Freemail" } }

Ключ -regex дозволяє порівнювати значення з регулярними виразами.

Також в -switch замість значень можна писати умови: switch ($value) { { $_ -le 5 <# умова #> } { <# код #> } }

Умова є булевим виразом, про який мова піде далі.

Булеві вирази Cимвол = означає присвоєння, а <, > - перенаправлення потоків, тому для порівняння значень використовують наступні оператори:

-eq (equal) - дорівнює -ne (not equal) - не дорівнює -gt (greater then) - більше -lt (less then) - менше -ge (greater equals) - більше або дорівнює -le (less equals) - менше або дорівнює

Наприклад:

2 + 2 -eq 4 # True

Порівняння рядків ігнорують регістр:

"Alpha" -eq "alpha" # True

Коли потрібно явно задати чутливість або не чутливість до регістру, в порівняннях використовують префікси "c" (case-sensitive, чутливий до регістру) та "i" (insensitive, ignore - нечутливий, ігнорувати регістр).

"Alpha" -ceq "alpha" # False

Крім того є оператори які показують чи можна знайти елемент в масиві:

1, 2, 4 -contains 1 # True 1, 2, 4 -notcontains 3 # True

А також, звісно логічні оператори: "2b" -or -not "2b" # True

not або ! - логічне ні, -and - і, -or - або, -xor - виключне або.

Цикли Циклів в PowerShell багато видів: while do while for ForEach І вже раніше згаданий ForEach-Object теж можна і варто використовувати як цикл. І навіть switch може працювати як цикл!

Цикл while:

while (умова) { // робити дію }

Цикл do while дуже корисний тим, що перевіряє умову після виконання тіла циклу, і якщо вона істинна - продовжує:

do { $input = Read-Host "Email: " } while (! ($input -like "*@*.*"));

Цикл for відомий всім з таких мов як C, чи JavaScript: