Глава 1. Основы PowerShell

Давайте начнём с базовых элементов и быстро просмотрим переменные, циклы, операторы if/else, переключатели и функции. Все они являются сердцем любого языка сценариев и поспособствуют вам в создании сценариев от простых до сложных.

Я не погружаюсь в версии PowerShell или в то чем является PowerShell (но вот вам быстрое для понимания определение без особого углубления: PowerShell это решение автоматизации задач составленных в командной строке оболочки и язык сценариев {Прим. пер.: подробнее в нашем переводе 4 издания Книга рецептов автоматизации Windows Server при помощи PowerShell Томаса Ли, Packt Publishing, 2021}). Я также не хочу говорить о том в каких платформах он может применяться или получать и устанавливать команды, потому как это не всеобъемлющая книга для изучения данного языка.

Основной посыл этой книги состоит в обучении вас созданию сценариев, не обладая знаниями лежащих под капотом элементов. Это подход, который я успешно применял со многими студентами. Постепенно они стали хорошо разбираться в этом языке программирования.

Не все обладают опытом программирования, и не все умеют создавать код. Однако, следуя описанному в этой книге подходу, вы сможете быстро создавать собственные сценарии и автоматизировать ИТ системы/ процессы.

[Замечание]Замечание

Ко всем применяемым в данной книге кодам можно получить доступ кликнув по кнопке Download Source Code, расположенной на www.apress.com/9781484277584 (следите за номерами листингов).

Переменные и вывод на печать

Для начала нам необходимо разобраться с основами, которые включают переменные и массивы. Всякая переменная в PowerShell начинается с символа доллара ($), например:


$a = "1"
$b = "Vikas"
 	   

Когда вы набираете $a и $b, будут отображены значения, как это показано на Рисунке 1-1.

 

Рисунок 1-1


Переменные в PowerShell

Теперь для вывода на свой экран вы можете применить Write-host:


Input: PS C:\> Write-host $a
Output: 1
Input: PS C:\> Write-host $b
Output: vikas 
		
[Совет]Совет

Возьмите за правило применять кавычки при присвоении значений переменным, как это показано в предыдущих двух примерах.

Давайте изменим значение фонового цвета того, что отображается через Write-host:


Input: PS C:\& Write-host $b -ForegroundColor Green
Output: vikas
Input: PS C:\& Write-host "processing .........." -ForegroundColor Green
Output: processing ..........
PS C:\&
		

Рисунок 1-2 отображает получаемый результат:

 

Рисунок 1-2


Применение Write-host переменная

Давайте по- быстрому проиллюстрируем массивы. В PowerShell массивы могут определяться аналогичным переменным способом. Вот некоторые образцы:


$b = "A","B","C","D","E"
		

Если вы определите это как переменную и разделяете все элементы запятой, PowerShell автоматически распознаёт что это массив, как то отображено на Рисунке 1-3.

 

Рисунок 1-3


Иллюстрация массива

Надлежащим способом определения массива выступает показанный ниже, потому как это показано самим синтаксисом, именно это представляет массив (что показано на Рисунке 1-4):


$c= @("server1","server2")
		
 

Рисунок 1-4


Синтаксис массива

Динамический массив может определяться как @(). Вы будете применять этот тип в примерах данной книги для добавления элементов в свой массив и выработки отчётов:


$d= @()
		

Переключатель If/Else

If else является обработкой на основе условия. Это основа любого языка программирования сценариев. Если некоторое условие истинно, вам необходимо обработать нечто; в противном случае обрабатывается нечто иное.

Листинг 1-1 показывает два примера. Во- первых, вы определяете значение переменной как 10 и затем вы пользуетесь соответствующим условными операторами и предложениями if else для проверки больше ли это чем 9 или меньше. На основании полученного результата вы применяете Write-host для вывода на экран, как это показано на Рисунке 1-5.

Обратите внимание, что -gt означает больше чем, а -lt меньше чем. Не беспокойтесь; я быстро пробегусь по ним в своём следующем подразделе.

 

Листинг 1-1. Пример кода для применения оператора больше чем в If/Else


[int]$a= "10"

if($a -gt "9")
{
write-host "True" -foregroundcolor Green
}else {
Write-host "False" -foregroundcolor Red
}
 	   

И да, [int] означает целое. Если вы применяете префикс перед самой переменной, он означает что вы исключительно определяете её как целое. Определять всегда лучше, но если вы не хотите, PowerShell достаточно сообразителен чтобы выполнить это неявно. Существуют именуемые типы данных и они содержат [string], [char], [int], [array] и так далее.

 

Рисунок 1-5


Отображение применения -gt в if/else

Листинг 1-2 и Рисунок 1-6 показывают фрагмент кода применения оператора меньше чем.

 

Листинг 1-2. Пример кода для применения оператора меньше чем в If/Else


[int]$a= "10"

if($a -lt "9"){
write-host "True" -foregroundcolor Green
}else {
Write-host "False" -foregroundcolor Red
}
 	   
 

Рисунок 1-6


Отображение применения -lt в if/else

Операторы условия/ логики

Ниже приводится перечень операторов условия/ логики, которые вы можете применять в своих повседневных сценариях. Без них многие операции сценариев были бы невозможны. Они всегда используются в предложениях сравнения if else, как это показано выше в родительском разделе.

  • -eq Равно

  • -ne Не равно

  • -ge Больше чем или равно

  • -gt Больше чем

  • -lt Меньше чем

  • -le Меньше чем или равно

  • -like     Сопоставление с символами подстановки

  • -notlike  Сопоставление с символами подстановки

  • -match   Сопоставление регулярным выражением

  • -notmatch Сопоставление регулярным выражением

  • -replace  Оператор замены

  • -contains Оператор включения

  • -notcontains Оператор включения

Логические операторы

  • -and Логическое И

  • -or  Логическое ИЛИ

  • -not Логическое ОТРИЦАНИЕ

  • -!   Логическое ОТРИЦАНИЕ

Логические операторы применяются когда вы желаете комбинировать свои условия. Давайте обновим приводимый ранее пример в отображаемый в Листинге 1-3 пример. Вы выводите на печать true когда значение переменной $a меньшем чем 9 или равно 10. Здесь вы сочетаете два условия. Поскольку это оператор OR, TRUE будет возвращаться при одном из совпадений. Здесь наше второе условие, $a -eq "10", совпадает если значение равно 10. Посмотрите на полученный на Рисунке 1-7 результат.

 

Листинг 1-3. Пример кода, отображающего логический оператор -or


[int]$a= "10"

If(($a -lt "9") -or ($a -eq "10")){
write-host "True" -foregroundcolor Green
}else {
Write-host "False" -foregroundcolor Red}
 	   
 

Рисунок 1-7


Отображение логического оператора -or

Когда вы применяете оператор OR, тогда должны совпадать оба условия если вы желаете получить TRUE, что не происходит в обоих случаях. Смотрите Листинге 1-4 и Рисунок 1-8.

 

Листинг 1-4. Пример кода, отображающего логический оператор -and


[int]$a= "10"

If(($a -lt "9") -and ($a -eq "10")){
write-host "True" -foregroundcolor Green
}else {
Write-host "False" -foregroundcolor Red}
 	   
 

Рисунок 1-8


Отображение логического оператора -and

Not служит для отрицания. В целом, я не пользуюсь им часто. По моему опыту, это приводит к человеческой ошибке когда вы спешите и недостаточно всё обдумаете.

Циклы

В любом языке программирования сценариев существуют два основных цикла, и это верно и для PowerShell. Существуют и прочие, но все они выступают вариантами этих двух.

Цикл For и цикл While

Цикл For

В PowerShell существуют три повтора для циклов for:

  • foreach

  • foreach-object

  • for

Давайте проведём различия между этими тремя циклами for рассмотрев их на примерах.

foreach: Вам требуется определить foreach $variable в $collection: foreach ($i in $x).

[Замечание]Замечание

В Листинге 1-5 вы сочетаете операторы if else и сравнения. На Рисунке 1-9 вы можете наблюдать получаемые результаты.

 

Листинг 1-5. Код, отображающий цикл foreach


$x=@("1","2","3",,"4")

foreach ($i in $x) {
      if ($i -lt 2) { write-host "$i is Green" -foregroundcolor Green
      }
         else{ write-host "$i is yellow" -foregroundcolor yellow
      }
 }
 	   
 

Рисунок 1-9


Отображение оператора foreach

foreach-object: Вы пользуетесь конвейером (PIPE) с его коллекцией для достижения тех же самых моментов (смотрите Листинг 1-6 и Рисунок 1-10):


$x | foreach-object
 	   
 

Листинг 1-6. Код, отображающий цикл foreach-object


$x=@("1","2","3",,"4")

$x | foreach-object{
        if ($_ -lt 2) { write-host "$_ is Green" -foregroundcolor Green
		}
        else{ write-host "$_ is yellow" -foregroundcolor yellow
		}
     }
 	   
 

Рисунок 1-10


Отображение оператора foreach-object

for: Это именно то, что вы могли запомнить в свои школьные годы. Я почти не применяю его вовсе и вижу меньше применений по всему сообществу. Посмотрите на его код в Листинге 1-7 и получаемые результаты на Рисунке 1-11.

 

Листинг 1-7. Код, отображающий цикл for


for($x=1; $x -le 5; $x++){
    if($x -lt 2){write-host "$x is Green" -foregroundcolor Green
    }
    else{ write-host "$x is yellow" -foregroundcolor yellow
    }
}
 	   
 

Рисунок 1-11


Отображение оператора for

Цикл While

Цикл while является совсем другим, потому как он продолжается пока его условие истинно. Давайте пройдёмся по некоторым образцам чтобы получить больше ясности.

Цикл while также обладает двумя повторами:

  • do-while

  • while

Для do-while вы выполняете нечто пока выполняется соответствие какого- то условия. В Листинге 1-8 переменная x = 0 и внутри вы наращиваете значение этой переменной, пока оно не станет равным 4. Для получаемых результатов посмотрите на Рисунок 1-12.

[Замечание]Замечание

Сначала вы делаете что- то, а потом проверяете соответствие условия.

 

Листинг 1-8. Код, отображающий цикл do-while


$x= 0

Do {$x++
if($x -lt 2){write-host "$x is Green" -foregroundcolor Green
              }
             else{ write-host "$x is yellow" -foregroundcolor yellow
}
 }while($x -ne 4)
 	   
 

Рисунок 1-12


Отображение оператора do-while

Для while вы также выполняете нечто пока выполняется соответствие какого- то условия. В Листинге 1-9 переменная x = 0 и внутри вы наращиваете значение этой переменной, пока оно не станет равным 4.

[Замечание]Замечание

Сначала вы осуществляете проверку и после этого выполняете свои дела.

Основное отличие между этими двумя, как вы можете видеть, состоит в том, что цикл while (пример, который показан на Листинге 1-9) проверяет своё условие перед самим циклом (повтором), а do-while осуществляет проверку после своего выполнения. Для получаемых результатов взгляните на Рисунок 1-13.

 

Листинг 1-9. Код, отображающий цикл while


$x= 0

while($x -ne 4) {$x++
if($x -lt 2){write-host "$x is Green" -foregroundcolor Green
       }
       else{ write-host "$x is yellow" -foregroundcolor yellow
      }
}
 	   
 

Рисунок 1-13


Отображение оператора while

Функции

Функции это такие предметы, которые после определения могут вызываться в любом месте сценария. Применение функций позволяет избегать повторов длинного кода. Это намёк для лучшего понимания. Я не буду вдаваться в подробности задания параметров и расширенных функциональных возможностей функции, так как мой главный мотив здесь - слегка разобраться и объединить свой код для выполнения необходимой работы. В Листинге 1-10 вы создаёте функцию Add для сложения двух чисел. Получаемый результат показан на Рисунке 1-14.

 

Листинг 1-10. Пример кода, отображающего функцию сложения двух чисел


Function Add ($a1, $b1)
{
$a1 + $b1
}
 	   

Add 5 6 # Вызов функции
		
 

Рисунок 1-14


Отображение функции Add сложения двух чисел

Аналогично, вы можете создать её для трёх и более чисел. Отсылаем вас к Листингу 1-11 и Рисунку 1-15.

 

Листинг 1-11. Пример кода, отображающего функцию сложения трёх чисел


Function Add ($a1, $b1, $c1)
{
$a1 + $b1 +$c1
}
 	   

Add 5 6 9 # Вызов функции
		
 

Рисунок 1-15


Отображение функции Add сложения трёх чисел

Выводы

В этой главе мы ознакомились с основами PowerShell, такими как переменные, массивы, операторы if/else и циклами, которые выступают основными строительными блоками для создания мощных сценариев в промышленной среде. Эти основы будут применяться и дальше в наших последующих главах.