Программирование на языке PowerShell

Технология Windows PowerShell позволяет не только выполнять команды администрирования, но и полноценно программировать алгоритмы на языке PowerShell. Для этого в языке PowerShell существуют атрибуты, присущие всем современным языкам программирования такие как: переменные, условия, циклы, массивы, обработка ошибок и все это можно использовать для написания сложных сценариев администрирования.

Ранее в материале основы Windows PowerShell мы с Вами узнали, что такое командлеты, конвейер и сценарии, а сегодня узнаем, как можно усилить работу с Windows PowerShell с помощью программирования.

Язык PowerShell – это объектно-ориентированный скриптовой язык программирования, который является частью технологии Windows PowerShell. Синтаксис всех программных конструкций языка PowerShell схож с синтаксисом СИ подобных языков.

Давайте подробней рассмотрим возможности программирования, которые есть в языке PowerShell.

Примечание! Все примеры ниже выполнялись в интегрированной среде сценариев Windows PowerShell (ISE) на операционной системе Windows Server 2016.

Программные конструкции Windows PowerShell

Переменные в 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 – удаление переменой.

Но, как я уже сказал, с переменной обычно работают, используя знак доллар ($).

Условные конструкции в 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"
   }

Скриншот 1

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

Скриншот 2

Циклы в 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
   }

Скриншот 3

Цикл 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
 }

Скриншот 4

Массивы в 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]
   }

Скриншот 5

Обработка ошибок в Windows PowerShell

Для отслеживания и перехвата ошибок в Windows PowerShell есть механизм Try…Catch. Он представляет собой конструкцию, при которой Вы весь код, в котором может возникнуть исключительная ситуация (ошибка), помещаете в блок Try. В блоке Catch Вы пишите код, который должен выполниться при возникновении ошибки. Если ошибок не было, то блок Catch просто не выполнятся.

В примере ниже мы хотим защитить себя от ситуаций, когда пользователь может ввести какое-нибудь непонятное число, например 0 (или вообще текст), а как Вы знаете делить на ноль нельзя. Поэтому тот код, в котором может возникнуть такая ситуация мы поместили в блок Try. В блоке catch мы выводим короткое, понятное предупреждение пользователю.

 
   Try {
    
      [int]$Number = Read-Host "Введите число"
      10 / $Number

   } catch {

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

   }

Вот мы с Вами и рассмотрели основы программирования на языке PowerShell, надеюсь, материал был Вам полезен, пока!

Понравилась статья? Поделиться с друзьями:
Заметки IT специалиста
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:
Нажимая на кнопку «Отправить комментарий», я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.