Глава 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.
Теперь для вывода на свой экран вы можете применить 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 отображает получаемый результат:
Давайте по- быстрому проиллюстрируем массивы. В PowerShell массивы могут определяться аналогичным переменным способом. Вот некоторые образцы:
$b = "A","B","C","D","E"
Если вы определите это как переменную и разделяете все элементы запятой, PowerShell автоматически распознаёт что это массив, как то отображено на Рисунке 1-3.
Надлежащим способом определения массива выступает показанный ниже, потому как это показано самим синтаксисом, именно это представляет массив (что показано на Рисунке 1-4):
$c= @("server1","server2")
Динамический массив может определяться как @()
. Вы будете применять этот тип в
примерах данной книги для добавления элементов в свой массив и выработки отчётов:
$d= @()
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-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
}
Ниже приводится перечень операторов условия/ логики, которые вы можете применять в своих повседневных сценариях. Без них
многие операции сценариев были бы невозможны. Они всегда используются в предложениях сравнения 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}
Когда вы применяете оператор 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}
Not
служит для отрицания. В целом, я не пользуюсь им часто. По моему опыту,
это приводит к человеческой ошибке когда вы спешите и недостаточно всё обдумаете.
В любом языке программирования сценариев существуют два основных цикла, и это верно и для PowerShell. Существуют и прочие, но все они выступают вариантами этих двух.
В PowerShell существуют три повтора для циклов for
:
-
foreach
-
foreach-object
-
for
Давайте проведём различия между этими тремя циклами for
рассмотрев их на примерах.
foreach
: Вам требуется определить foreach $variable
в $collection
: foreach ($i in $x)
.
Замечание | |
---|---|
В Листинге 1-5 вы сочетаете операторы
|
Листинг 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
}
}
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
}
}
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
}
}
Цикл 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)
Для 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-10
вы создаёте функцию Add
для сложения двух чисел. Получаемый результат показан на
Рисунке 1-14.
Листинг 1-10. Пример кода, отображающего функцию сложения двух чисел
Function Add ($a1, $b1)
{
$a1 + $b1
}
Add 5 6 # Вызов функции
Аналогично, вы можете создать её для трёх и более чисел. Отсылаем вас к Листингу 1-11 и Рисунку 1-15.
Листинг 1-11. Пример кода, отображающего функцию сложения трёх чисел
Function Add ($a1, $b1, $c1)
{
$a1 + $b1 +$c1
}
Add 5 6 9 # Вызов функции