Программирование на языке PowerShell
Технология Windows PowerShell позволяет не только выполнять команды администрирования, но и полноценно программировать алгоритмы на языке PowerShell. Для этого в языке PowerShell существуют атрибуты, присущие всем современным языкам программирования такие как: переменные, условия, циклы, массивы, обработка ошибок и все это можно использовать для написания сложных сценариев администрирования.
Язык PowerShell – это объектно-ориентированный скриптовой язык программирования, который является частью технологии Windows PowerShell. Синтаксис всех программных конструкций языка PowerShell схож с синтаксисом СИ подобных языков.
Давайте подробней рассмотрим возможности программирования, которые есть в языке PowerShell.
Содержимое
Переменные в Windows PowerShell
В Windows PowerShell есть как встроенные переменные, так и переменные, которые может создавать пользователь. Все переменные в PowerShell можно посмотреть с помощью командлета Get-Variable, также с помощью данного командлета можно получить значение переменной, но обычно к переменной обращаются через знак доллар ($).
Переменные в PowerShell можно объявлять с указанием типа и без, при объявлении переменной ее можно сразу инициализировать. Еще одной особенностью переменных в PowerShell является то, что они могут менять свой тип в зависимости от значения этой переменной, но это только в том случае если мы принудительно при объявлении переменной не указали ее тип.
Для того чтобы создать переменную, необходимо перед ее названием указать знак доллара ($). В случае необходимости можно принудительно указать тип данных переменной в квадратных скобках перед ее названием. Например, ниже мы создаем переменную TestVar с целочисленным типом данных (int) и сразу ее инициализируем.
1
|
[int]$TestVar = 100
|
Так как PowerShell объектно-ориентированный язык программирования, в качестве значения переменной может выступать сложный объект со своими свойствами и методами. Например, встроенная переменная $PSVersionTable, которая содержит служебную информацию о версии PowerShell.
Типов данных переменных в Windows PowerShell очень много, так как они основаны на типах, которые есть в .NET Framework. Но, в то же время, есть и наиболее распространенные типы данных, т.е. базовые, такие как:
- [int] — целое число, 32 бита;
- [single] — число с плавающей запятой одинарной точности;
- [double] — число с плавающей запятой двойной точности;
- [string] — строка символов, т.е. текст;
- [char] — один символ;
- [Boolean] — значения «Истина» или «Ложь»;
- [datetime] — дата или время.
Для работы с переменными существуют специальные командлеты PowerShell:
- New-Variable – создание переменной;
- Set-Variable – присваивание переменной значения;
- Get-Variable – получение переменной;
- Clear-Variable – очистка переменной;
- Remove-Variable – удаление переменой.
Но, как я уже сказал, с переменной обычно работают, используя знак доллар ($).
Условные конструкции в PowerShell
В PowerShell, как и в других языках программирования, есть и условные конструкции. Они нужны для того, чтобы на основе результата проверки выполнять те или иные действия. К условным конструкциям в PowerShell относятся конструкции:
- IF
- IF…ELSE
- IF…ELSEIF…ELSE
- SWITCH
Так как условные конструкции предполагают сравнение чего-либо, необходимо затронуть такую тему как операторы сравнения, тем более что в PowerShell они пишутся отличным от других языков способом.
Операторы сравнения PowerShell
- -eq – равно (в других языках обычно знак =);
- -ne – не равно (в других языках эквивалентно знакам <> или !=);
- -gt – больше (в других языках обычно знак >);
- -lt – меньше (в других языках обычно знак <);
- -ge – больше или равно (в других языках эквивалентно знакам >=);
- -le – меньше или равно (в других языках эквивалентно знакам <=).
Примеры использования условных конструкций
IF
Если условие выполняется, то начинает работу блок в фигурных скобках.
1
2
3
4
|
[int]$TestVar = 100
If ($TestVar -eq 100){
Write-Host "Переменная TestVar = 100"
}
|

IF…ELSE
Если условие выполняется, то начинает работу блок в фигурных скобках после оператора IF, если не выполняется блок после ELSE.
1
2
3
4
5
6
7
|
[int]$TestVar = 10
If ($TestVar -eq 100){
Write-Host "Переменная TestVar = 100"
}
ELSE {
Write-Host "Переменная TestVar <> 100"
}
|
IF…ELSEIF…ELSE
Если переменная TestVar = 100, то выполняется блок после IF, если больше 100 блок после ELSEIF, если меньше 100, то блок после ELSE.
1
2
3
4
5
6
7
8
9
10
|
[int]$TestVar = 150
If ($TestVar -eq 100){
Write-Host "Переменная TestVar = 100"
}
ELSEIF ($TestVar -gt 100){
Write-Host "Переменная TestVar > 100"
}
ELSE {
Write-Host "Переменная TestVar < 100"
}
|
SWITCH
В данном случае переменная TestVar сравнивается с перечисленными в фигурных скобках значениями и если условие истина, то выполняется соответствующий блок, если никакое значение не подошло, выполняется необязательный блок default.
1
2
3
4
5
6
7
8
9
10
11
|
[int]$TestVar = 3
SWITCH ($TestVar)
{
0 {Write-Host "Переменная TestVar = 0"}
1 {Write-Host "Переменная TestVar = 1"}
2 {Write-Host "Переменная TestVar = 2"}
3 {Write-Host "Переменная TestVar = 3"}
4 {Write-Host "Переменная TestVar = 4"}
5 {Write-Host "Переменная TestVar = 5"}
default {Write-Host "Неопределенное значение"}
}
|
Циклы в PowerShell
В языке PowerShell можно использовать и циклы. Цикл – это программная конструкция, которая подразумевает многократное выполнение одних и тех же действий.
В Windows PowerShell есть несколько разновидностей циклов, а именно:
- WHILE
- DO WHILE
- DO UNTIL
- FOR
- FOREACH
Цикл WHILE
Данный цикл работает до тех пор, пока выполняется условие вначале цикла, т.е. этот цикл с предусловием.
1
2
3
4
5
6
|
[int]$TestVar = 1
#Пока $TestVar меньше 10 цикл будет выполняться
WHILE ($TestVar -lt 10){
Write-Host $TestVar
$TestVar = $TestVar + 1 #Увеличиваем переменную на 1
}
|
Цикл DO WHILE
Это цикл с постусловием, т.е. он хоть раз, но выполнится, в отличие от цикла WHILE, работа которого может и не начаться, если условие не выполняется.
1
2
3
4
5
6
7
|
[int]$TestVar = 1
#Пока $TestVar меньше 10 цикл будет выполняться
DO {
Write-Host $TestVar
$TestVar = $TestVar + 1 #Увеличиваем переменную на 1
}
WHILE ($TestVar -lt 10) #$TestVar < 10
|
Цикл DO UNTIL
Если цикл DO WHILE выполняется пока условие истина, то DO UNTIL выполняется пока условие ложно.
1
2
3
4
5
6
7
|
[int]$TestVar = 1
#Когда $TestVar станет больше 10, цикл прекратится
DO {
Write-Host $TestVar
$TestVar = $TestVar + 1 #Увеличиваем переменную на 1
}
UNTIL ($TestVar -gt 10) #$TestVar > 10
|
Цикл FOR
Данный тип цикла отличается от других тем, что нам заранее известно количество итераций цикла, т.е. он выполнится определенное количество раз. Например, в цикле WHILE мы не знаем, продолжит ли он свою работу после первой итерации (мы можем и не знать, войдем ли мы вообще в цикл).
1
2
3
4
|
#Пока $TestVar меньше 10 цикл будет выполняться
FOR ([int]$TestVar = 1; $TestVar -lt 10; $TestVar++){
Write-Host $TestVar
}
|
Перебор FOREACH
Это разновидность цикла, при которой происходит перебор элементов коллекции. В примере ниже мы сохраняем результат командлета Get-Service (т.е. список служб), а затем с помощь перебора FOREACH выводим название службы и ее статус.
1
2
3
4
|
$TMPService = Get-Service
FOREACH ($Service In $TMPService){
$Service.Name + " - " + $Service.Status
}
|
Массивы в PowerShell
Конечно же, в PowerShell есть и массивы. Массив — это структура данных, предназначенная для хранения коллекции элементов. Элементы массива могут быть одного или разных типов, т.е. массив может быть как строго типизированный, так и нет.
Как и во многих языках программирования в PowerShell к элементу массив можно обращаться по индексу (начинающегося с нуля). При инициализации массива значения мы перечисляем через запятую.
Пример создания массива, который может содержать элементы разных типов.
1
2
3
4
|
#Создаем массив
$Array = 1, 3, "Пример", 7, 9
#Выводим 3 элемент массива
$Array[2]
|
Пример создания строго типизированного массива.
1
2
3
4
|
#Создаем массив
[int32[]]$Array = 1, 3, 5, 7, 9
#Выводим 3 элемент массива
$Array[2]
|
Пример перебора элементов массива.
1
2
3
4
5
6
|
#Создаем массив
[int32[]]$Array = 1, 3, 5, 7, 9
#Циклом for перебираем массив. $Array.count - это количество элементов массива
FOR ([int]$i = 0; $i -lt $Array.count; $i++){
$Array[$i]
}
|
Обработка ошибок в Windows PowerShell
Для отслеживания и перехвата ошибок в Windows PowerShell есть механизм Try…Catch. Он представляет собой конструкцию, при которой Вы весь код, в котором может возникнуть исключительная ситуация (ошибка), помещаете в блок Try. В блоке Catch Вы пишите код, который должен выполниться при возникновении ошибки. Если ошибок не было, то блок Catch просто не выполнятся.
В примере ниже мы хотим защитить себя от ситуаций, когда пользователь может ввести какое-нибудь непонятное число, например 0 (или вообще текст), а как Вы знаете делить на ноль нельзя. Поэтому тот код, в котором может возникнуть такая ситуация мы поместили в блок Try. В блоке catch мы выводим короткое, понятное предупреждение пользователю.
1
2
3
4
5
6
7
8
9
10
|
Try {
[int]$Number = Read-Host "Введите число"
10 / $Number
} catch {
Write-Warning "Некорректное число"
}
|