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