
PowerShell – це потужний інструмент для роботи зі скриптами та автоматизації завдань у середовищі Windows. Одним з найважливіших аспектів програмування в PowerShell є розуміння різних операторів та керуючих інструкцій, які дозволяють ефективно керувати потоком виконання програм. У нашому повному посібнику про оператори та керуючі інструкції в PowerShell ви дізнаєтесь про різні типи операторів, такі як арифметичні, порівняння, логічні, присвоєння, рядкові та інші. Ви дізнаєтесь, як використовувати ці оператори для виконання різних дій, таких як обчислення, порівняння значень, перевірка умов, робота зі змінними та багато іншого. Крім того, ми розглянемо різні керуючі інструкції, такі як умовні оператори if-else, оператори вибору switch, цикли for, while та do-while, які дозволяють повторювати дії в програмах та обробляти різні сценарії виконання.
Ви дізнаєтесь, як писати ефективні скрипти та автоматизувати рутинні завдання, що значно полегшить вашу роботу у Windows-середовищі. Здобути розуміння роботи з операторами та керуючими інструкціями в PowerShell є ключовим для досягнення успішних результатів у програмуванні та автоматизації завдань. Розширте свої знання та станьте більш ефективним програмістом з нашим повним посібником! Однією з особливостей операторів PowerShell є їхній поліморфізм, що дозволяє застосовувати один і той же оператор до об’єктів різних типів. Наприклад, оператори додавання (+) та множення (*) можна застосовувати до чисел, рядків та масивів. При цьому відмінність PowerShell від багатьох інших об’єктно орієнтованих мов програмування полягає в тому, що поведінка операторів для основних типів даних (рядки, числа, масиви та хеш-таблиці) реалізується безпосередньо інтерпретатором, а не за допомогою того чи іншого методу об’єктів певного типу.
Основні арифметичні оператори, які підтримуються в оболонці PowerShell, наведено в табл. 8.1.
З точки зору поліморфної поведінки найбільш цікавими є оператори додавання і множення. Давайте докладніше розглянемо ці оператори.
Як вже говорилося раніше, поведінка операторів + і * для чисел, рядків, масивів і хеш-таблиць визначається самим інтерпретатором PowerShell. В результаті складання або множення двох чисел виходить число. Результатом додавання (об’єднання) двох рядків є рядок. Коли додаються два масиви, створюється новий масив, який є об’єднанням масивів, які потрібно додати.
А що буде, якщо спробувати додати об’єкти різних типів, наприклад, число з рядком? При цьому поведінка оператора буде визначатися типом операнда зліва. Необхідно запам’ятати так званого правшу лівші: тип операнд, що стоїть зліва, задає тип результату дії оператора.
Якщо лівий операнд є числом, PowerShell спробує перетворити правий операнд на числовий тип.
Наприклад:
PS С:\> 1+"12" 13 Как видим, строка ”12” была преобразована к числу 12. Результат действия оператора сложения — число 13. Теперь обратный пример, когда левый операнд является строкой: PS С:\> "1"+12 112 Здесь число 12 преобразуется к строке ”12” и в результате конкатенации возвращается строка ”112”. Если правый операнд нельзя преобразовать к типу левого операнда, то возникнет ошибка: PS С:\> 1+"а" Не удается преобразовать значение "а” в тип ’’System. Int32”. Ошибка :*’’Входная строка имела неверный формат.” строка:1 знак:1 т 1+"а" 4 Categoryinfo : InvalidArgument: (:) [], RuntimeException 4- FullyQualifiedErrorld : InvalidCastFromStringToInteger
Якщо операнд ліворуч від оператора додавання є масивом, то операнд праворуч додається до цього масиву. При цьому створюється новий масив типу [object- [ ] ], в який копіюється вміст операндів (це пов’язано з тим, що розмірність фіксована ). У процесі створення нового масиву всі обмеження на типи доданих масивів будуть втрачені. Давайте розглянемо приклад.
Створимо масив цілих чисел:
PS С:\> $а = [int[]J (1,2,3,4) PS С:\> $а.getType().fullName System.Int32[] Если попробовать изменить значение элемента этого массива на какую-либо строку, то возникнет ошибка, т. к. элементами массива $а могут быть только целые числа: PS С:\> $а[О]="ааа" Не удается преобразовать значение "ааа" в тип "System.Int32”. Ошибка: "Входная строка имела неверный формат." строка:1 знак:1 + $а[0]="ааа" + _——~~ + Categoryinfo : InvalidArgument: (:) [], RuntimeException + FullyQualifiedErrorld : InvalidCastFromStringToInteger Добавим теперь к массиву $а еще один символьный элемент с помощью оператора сложения: PS С:\> $a=$a+"abc" Вновь попробуем изменить значение первого элемента массива $а, записав в него символьную строку: PS С:\> $а[0]="ааа" PS С:\> $а ааа 2 3 4 abc Как видим, теперь ошибка не возникает. Это связано с изменением типа массива $а: PS С:\> $а.getType().fullName System.Object[]
Збільшений масив $a має тип [object [ ] ], його елементами можуть бути об’єкти будь-якого типу.
Тепер перейдемо до додавання хеш-таблиць. Як і у випадку зі звичайними масивами, при додаванні хеш-таблиць створюється новий асоціативний масив, в який копіюються елементи з доданих масивів. У цьому випадку обидва операнди повинні бути хеш-таблицями (перетворення типів тут не підтримується). Елементи хеш-таблиці зліва від оператора додавання спочатку копіюються в новий масив, а потім елементи хеш-таблиці вправо. Якщо значення ключа з правого операнда вже знайдено в лівому операні, то при додаванні виникне помилка.
Давайте розглянемо приклад:
PS С:\> $left=@{а=1;Ь=2;с=3} PS С:\> $right=@{d=4;е=5} PS С:\> $sum=$left+$right PS С:\> $sum 152 Name Value d 4 а 1 b 2 е 5 с 3 Новая результирующая ХЭШ-таблица по-прежнему имеет ТИП System.Collections. Hashtable: PS С: \> $sum. getType () . fullName System.Collections.Hashtable
Оператор множення може діяти на числа, рядки і регулярні масиви (операція множення хеш-таблиці невизначена). При цьому праворуч від оператора множення має знаходитися число, інакше виникне помилка. Якщо зліва від оператора множення є число, то операція множення виконується звичайним способом:
PS С:\> 6*5 30 Если левым операндом является строка, то она повторяется указанное количество раз: PS С:\> "abc”*3 abcabcabc Если умножить строку на ноль, результатом будет пустая строка (тип System, string, длина равна 0): PS С:\> "abc"*0 PS С:\> (”abc"*0).getType().fullName System.String PS C:\> (”abc"*0).length 0 Аналогичным образом оператор умножения действует на массивы: PS С:\> $а=1,2,3 PS С:\> $а=$а*2 PS С:\> $а 1 2 3 1 2 3
Як і у випадку з оператором додавання, при множенні масиву на число створюється новий масив типу [0bject [ ] потрібної розмірності і в нього копіюються елементи вихідного масиву.
Оператори віднімання (-), ділення (/) і залишок від ділення (e) у PowerShell визначаються лише для чисел. Спеціального оператора цілочисельного ділення немає: якщо ділити два цілих числа, результатом буде дійсне число (TYPE System. Doub1e).
Наприклад:
PS С:\> 123/4 30.75
Якщо потрібно округлити результат до найближчого цілого числа, його просто потрібно перетворити на тип [int].
Наприклад:
PS С:\> [int](123/4) 31
Слід враховувати, що PowerShell використовує так зване округлення Бункера при перекладі дійсного числа в ціле число: якщо число напівціле (0, 5, 1, 5, 2, 5 і т. Д.), То воно округлюється до найближчого парного числа. Так, числа 1,5 і 2,5 округлюються до 2, а 3,5 і 4,5 округлюються до 4. Якщо операнди можна перетворити на числа, PowerShell виконає перетворення.
Наприклад:
PS С:\> "123"/4 30.75 PS С:\> 123/”4" 30.75 PS С:\> "123"/"4" 30.75
Оператор віднімання може бути застосований до змінних типу System. Datetime, у якому зберігаються дата й час. Наприклад, припустимо, що змінна $d 1 зберігає об’єкт, що відповідає даті 8 березня 2021 року, а змінна $d 2 зберігає об’єкт, що відповідає даті 23 лютого 2021 року:
PS С:\> $dl=Get-Date -Year 2021 -Month 03 -Day 08 PS C:\> $dl.getType().fullName System.DateTime PS C:\> $d2=Get-Date -Year 2021 -Month 02 -Day 23 Теперь мы можем вычесть из одной даты другую, определив, например, количество дней между ними: PS С:\> ($dl-$d2) .Days 13
Поряд з простим оператором призначення (=), PowerShell підтримує C-подібні оператори призначення сполук (табл. 8.2).
У табл. 8.2 Для кожного складеного оператора присвоєння задається його аналог, складений з використанням звичайного оператора присвоєння і певного арифметичного оператора. Варто враховувати, що для арифметичних операторів тут діють всі правила і обмеження, описані в попередньому розділі. Наприклад, оператор += може застосовуватися не тільки до чисел, але і до рядків:
PS С:\> $а = "аа" PS С:\> $а += "ЬЬ" PS С:\> $а aabb
Важливою особливістю оператора присвоєння в PowerShell є те, що з його допомогою можна привласнювати значення відразу декільком змінним однією командою. В цьому випадку першому елементу призначеного значення буде присвоєно першу змінній, другому елементу – другій змінній, третьому елементу – третьої змінної і так далі. Наприклад, наступна команда встановить змінну $a на 1, а змінну $b на 2:
PS С:\> $а, $b = 1, 2 PS С:\> $а 1 PS С:\> $Ь 2
Якщо призначене значення містить більше елементів, ніж вказані змінні, решта значень будуть присвоєні останній змінній. Наприклад, після виконання наступної команди значення змінної $a буде числом 1, а значення змінної $b – масивом чисел 2 і 3:
PS С:\> $а, $b = 1, 2, 3 PS С:\> $а 1 PS С:\> $Ь 2 3 PS С: \> $Ь. igetType () . fullName System.Object[]
Оператори порівняння дозволяють порівнювати значення параметрів в командах. Для кожної операції порівняння створюється умова, яка в залежності від того, істинний оператор чи ні, приймає або значення True, або значення Fa1se. PowerShell підтримує кілька операторів порівняння, з версіями, чутливими до регістру та нечутливими до регістру, визначеними для кожного оператора. Основні оператори порівняння наведені в табл. 8.3.
Базова версія операторів порівняння (-eq, -pe, -lt і так далі) за замовчуванням нечутлива до регістру. Якщо оператор починається з букви c (-ceq, -spe, -c1t і т. Д.), То при порівнянні буде враховуватися випадок букв. Якщо оператор починається з літери (-ieq, -ine, -i1t і так далі), порівняння нечутливе до регістру.
ЗАУВАЖЕННЯ PowerShell не використовує звичайні символи > та < для позначення операторів порівняння, оскільки вони зарезервовані для переспрямування вводу-виводу.
Як і у випадку з арифметичними операторами, для операторів порівняння справедливе «правило лівої руки» (тип лівого операнда є вирішальним). Якщо число порівнюється з рядком (число знаходиться ліворуч від оператора порівняння), рядок перетворюється на число, а два числа порівнюються. Якщо лівий операнд є рядком, правий операнд перетворюється на тип символу і два рядки порівнюються.
Давайте розглянемо кілька прикладів:
Сравнение числа с числом: PS С:\> 01 -eq 001 True Сравнение числа со строкой (строка ”001” преобразуется в число 1): PS С:\> 01 -eq "001" True Сравнение строки с числом (число 001 преобразуется в строку "001”): PS С:\> "01" -eq 001 False
У PowerShell можна порівняти масив з числом, і в результаті вийде не логічне значення True або Fa1se, а новий масив, який містить елементи, які пройшли порівняння.
Наприклад:
PS С:\> 1,2,3,4,1,2,3 -eq 1 1 1 PS С:\> 1,2,3,4,1,2,3 -ge 3 3 4 3 Если тест на сравнение не пройдет ни один элемент, то результатом будет пустой массив. Для того чтобы узнать, есть ли в массиве элементы, равные указанному значению, можно воспользоваться оператором -contains, в этом случае результатом будет True ИЛИ False: PS С:\> 1, 2, 3, 4 -contains 3 True PS С:\> 1, 2, 3, 4 -contains 5 False
На додаток до основних операторів порівняння, PowerShell також включає оператори, які перевіряють рядки символів на відповідність певному шаблону. Підтримуються два типи шаблонів: вирази узагальнення та регулярні вирази.
Раніше ми використовували символи узагальнення (* і ? ), коли використовуємо, скажімо, командлет dir. Наприклад, команда dir * .doc відображає всі файли в директорії current•, які мають розширення .doc і будь-яке ім’я (символ узагальнення * замінює будь-яку кількість будь-яких символів). PowerShell підтримує чотири типи символів узагальнення (табл. 8.4) і кілька операторів, які перевіряють рядки на шаблони узагальнення (табл. 8.5).
Як бачите, використовувати підстановочні шаблони дуже просто, але можливості таких шаблонів обмежені. Якщо є необхідність перевірити більш складні умови, то потрібно використовувати шаблони з регулярними виразами.
Регулярні вирази узагальнюють і розширюють поняття узагальнюючих шаблонів. Для визначення зразка використовуються літерали та метасимволи. Кожен символ, який не має особливого значення в регулярних виразах, розглядається як буквальний і повинен точно відповідати при пошуку. Наприклад, букви і цифри – це буквені символи. Метасимволи -t – символи з особливим значенням в регулярних виразах (табл. 8.6).
ЗАУВАЖЕННЯ Підтримка регулярних виразів в PowerShell реалізована за допомогою спеціальних класів в .NET framework. Мова регулярних виразів, підтримувана цими класами, дуже потужна, але детально обговорити ці питання виходить за рамки цієї книги. Докладніші відомості про деякі аспекти регулярних виразів див. у вбудованій довідці PowerShell (Get—He1p про вираз regu1ar).
У PowerShell оператори -match і -rep1ace працюють з регулярними виразами (табл. 8.7).
Іноді в рамках одного твердження необхідно перевірити відразу кілька умов. Оператори порівняння можуть бути з’єднані між собою за допомогою логічних операторів, наведених у табл. 8.8 У разі використання логічного оператора PowerShell перевіряє кожну умову окремо, а потім обчислює значення всього оператора, пов’язуючи умови за допомогою логічних операторів.
У PowerShell, як і в будь-який інший алгоритмічній мові, є елементи, які дозволяють виконувати логічне порівняння і виконувати різні дії в залежності від його результату, або які дозволяють повторювати одну або кілька команд знову і знову.
Логічні порівняння лежать в основі майже всіх алгоритмічних мов програмування. У PowerShell оператор If можна використовувати для виконання певних блоків коду, лише якщо для вказаної умови встановлено значення True. Також можна встановити одну або кілька додаткових умов виконання, якщо для всіх попередніх умов було встановлено значення Fa1se (false). Нарешті, можна вказати додатковий блок коду, який буде виконуватися, якщо жодна з умов не встановлена в значення True.
Синтаксис інструкції If зазвичай такий:
if (условие1) {блок_кода1} [elseif (условие2) {блок_кода2}] [else (блок_кодаЗ}] При выполнении инструкции if проверяется истинность условного выражения условие!.
ЗАУВАЖЕННЯ Найпоширенішим способом побудови умовних виразів у PowerShell є використання операторів порівняння та логічних операторів, розглянутих раніше. Крім того, важливою особливістю мови є те, що конвеєри команд PowerShell можуть використовуватися в якості умовних виразів.
Якщо умова! має значення True, ТО виконується блок-_код1, після чого PowerShell завершує виконання інструкції if. Якщо умова! має значення False, то PowerShell перевіряє істинність умовного вираження умов2. Якщо умова2 має значення True, то виконується блок’_кода2, після чого PowerShell завершує виконання інструкції if. Якщо і умова1, і умова2 мають значення False, то виконується блок’_кодаз, а потім PowerShell завершує виконання інструкції if. Наведемо приклад використання інструкції if в інтерактивному режимі роботи.
Запишемо в змінну $а число 10:
PS С:\> $а=10 Сравним теперь значение переменной $а с числом 15: PS С:\> if ($а -eq 15) { » 'Значение $а равно 15' » ) >> else {'Значение $а не равно 15'} » Значение $а не равно 15
З цього прикладу також видно, що ви можете інтерактивно виконувати багаторядкові оператори в PowerShell (що може бути корисно при налагодженні скриптів).
PowerShell підтримує кілька видів циклів. Найпростіший із них — цикл while, у якому команди виконуються до того часу, поки умова, що перевіряється, має значення True. Інструкція while має наступний синтаксис: while {умова){блок_команд} Під час виконання інструкції while оболонка PowerShell обчислює розділ умову інструкції, перш ніж перейти до розділу блок_команд. Умова в інструкції приймає значення True або False. Поки умова має значення True, PowerShell повторює виконання розділу блок_команд.
Зауваження Як і в інструкції if, в умовному вираженні циклу while може використовуватися конвеєр команд PowerShell.
Розділ блок-_команд інструкції while містить одну або кілька команд, які виконуються щоразу при вході та повторенні циклу. Наприклад, наступна інструкція while відображає числа від 1 до 3, якщо змінна $vai не була створена або була створена та ініціалізована значенням 0:
PS С:\> while($val -ne 3) » { » $val++ » $val » } » 1 2 3
У даному прикладі умова (значення змінної $vai не дорівнює 3) має значення True, поки $vai дорівнює 0, 1 або 2. При кожному повторенні циклу значення $vai збільшується на 1 з використанням унарного оператора збільшення значення ++ ($vai++ ). При останньому виконанні циклу значенням $vai стає 3. При цьому умова, що перевіряється, приймає значення False, і цикл завершується.
Цикл Do ... while похож на цикл while, однако условие в нем проверяется не до блока команд, а после: do{блок_команд}while (условие) Например: PS С:\> $val=O PS С:\> do {$val++; $val) while ($val -ne 3) 1 2 3
Оператор For в PowerShell реалізує інший тип циклу, цикл з лічильником. Зазвичай цикл For використовується для перебирання масиву значень і виконання дій над підмножиною цих значень. У PowerShell оператор For використовується не так часто, як в інших мовах програмування, тому що колекції об’єктів зазвичай зручніше обробляти за допомогою оператора Forach. Однак, якщо вам потрібно знати, з яким елементом колекції або масиву ми працюємо в заданій ітерації, то цикл For може допомогти.
Синтаксис оператора For:
for (умова, умова, повторення) командний блок)
Ініціація – це одна або кілька команд, розділених комами, які виконуються перед початком циклу. Ця частина циклу зазвичай використовується для створення та призначення початкового значення змінній, яка потім буде основою для перевірки умови в наступній частині оператора For;
Умова — це частина оператора For, яка може приймати булеве значення True або FaIse. PowerShell обчислює умову кожного разу, коли виконується функція For. Якщо результатом цієї оцінки є True, то виконуються команди в блоці командного блоку, а потім виконується нова оцінка умови оператора. Якщо результат оцінки умови знову стає True, команди блоку команд виконуються знову, і так далі, поки результатом перевірки умови не буде Fa1se;
Рух – це одна або кілька команд, розділених комами, які виконуються кожного разу, коли цикл повторюється. Ця частина циклу зазвичай використовується для зміни змінної, що перевіряється всередині умови;
Командний блок – це набір з однієї або декількох команд, які виконуються при введенні в цикл або повторенні циклу. Вміст блоку команд укладено в фігурні фігурні дужки.
Класичний приклад:
PS С:\> for ($i = 0; $i -It 5; $i++) { $i } 0 1 2 3 4
Оператор Foreach дозволяє послідовно перебирати елементи колекцій. Найпростішим і найбільш часто використовуваним типом колекції для переміщення є масив. Як правило, в циклі Foreach для кожного елемента масиву виконується одна або кілька команд.
Особливість циклу Foreach полягає в тому, що його синтаксис і робота залежать від того, знаходиться оператор Foreach поза конвеєра команд або всередині конвеєра.
В даному випадку синтаксис циклу Foreach виглядає наступним чином: foreach ($element в $collection) командний блок)
Дужки вказують на колекцію, в якій ви переглядаєте. Коли ви виконуєте цикл Forach, система автоматично створює змінну $element. Перед кожною ітерацією в циклі цій змінній присвоюється значення наступного елемента в колекції. Розділ Блок команд містить команди, які виконуються для кожного елемента колекції.
Наприклад, цикл Foreach у наведеному нижче прикладі відображає значення в масиві з іменем $1etterArray:
PS С:\> $letterArray = "а","b","с","d" PS С:\> foreach ($letter in $letterArray) {Write-Host $letter} a b c d
У першій команді тут створюється масив $1etterArray, в якому записуються чотири елементи: символи a, b, c і d. Під час першого виконання оператора Foreach змінна $1etter встановлюється значенням, рівним першому елементу в $letterArray (a), а потім для відображення змінної $1etter використовується командлет Write-Host. На наступній ітерації циклу змінній $1etter присвоюється значення b, і так далі. Після того, як всі елементи масиву $1etterArray будуть ітеровані, цикл вийде.
Оператор Foreach також можна використовувати разом із командлетами, які повертають колекції елементів.
Наприклад:
PS С:\> $п = 0; foreach ($f in dir *.txt) { $n += $f.length } PS C:\> $n 2690555
Тут спочатку створюється і обнуляється змінна $n, а потім в циклі Foreach за допомогою командлета dir генерується колекція файлів з розширенням .txt в поточному каталозі. В інструкції Foreach ви перебираєте всі елементи в цій колекції, і на кожному кроці ви можете отримати доступ до поточного елемента (відповідного файлу) за допомогою змінної $f. У командному блоці циклу Foreach до поточного значення змінної $p додається значення поля 1ength (розмір файлу) змінної $f. В результаті цього циклу змінна $n буде зберігати загальний розмір файлів в поточному каталозі, які мають розширення .txt.
Якщо оператор Foreach з’являється всередині конвеєра команд, PowerShell розуміє його як псевдонім Forach, який відповідає командлету ForEach-Object. Таким чином, в цьому випадку командлет ForEach-Obj ect фактично виконується, і вам більше не потрібно вказувати частину інструкції ($element в $CALL), оскільки елементи в колекції надаються командному блоку попередньою командою в конвеєрі. Синтаксис оператора Forach, що використовується всередині конвеєра команд, у найпростішому випадку виглядає наступним чином: команда foreach { командний блок)
Приклад розрахунку загального розміру текстових файлів з поточного каталогу для цієї версії оператора Foreach буде виглядати так:
PS С:\> $п = 0; dir *.txt | foreach { $n += length } PS C:\> $n 2690555
Взагалі, псевдонім Foreach може вказувати не один командний блок, а три: початковий, основний і кінцевий командні блоки. Початковий і кінцевий блоки команд виконуються один раз, а основний блок запускається кожен раз, коли він проходить через колекцію або масив.
Синтаксис псевдоніма Forach, який використовується в конвеєрі команд з блоками start, master і end, виглядає наступним чином:
команда | foreach {начальный_блок_команд} {основной_блок_команд} {конечный_блок_команд} Для этого варианта инструкции Foreach наш пример можно записать следующим образом: PS С:\> dir *.txt | foreach ($n = 0}{ $n += $_.length } {Write-Host $n) 2690555
Таким чином, ви можете вирішити проблему ітерації через елементи колекції або за допомогою оператора циклу Forach, або шляхом обробки об’єктів у конвеєрі за допомогою командлета ForEach-Object.
Вибираючи, який з цих підходів використовувати, слід мати на увазі наступний момент. Блок коду в командлеті ForEach-Object починає виконуватися, як тільки перший об’єкт з’являється в конвеєрі, а тіло циклу foreach ( ) вимагає, щоб всі об’єкти були отримані і колекція була повністю сформована. Тому під час використання командлета ForEach-Object вам потрібно менше оперативної пам’яті (не потрібно зберігати в пам’яті цілу колекцію об’єктів). Однак, якщо масово перебирати об’єкти готової колекції за допомогою foreach (), спрацьовують внутрішні оптимізації і час обробки для всіх елементів буде значно менше, ніж якщо запустити код для кожного елемента в контейнері.
Тому вибір, як обробити колекцію об’єктів, залежить від того, яка характеристика для нас зараз важливіша: споживання оперативної пам’яті або швидкість виконання завдання.
Оператор Break дозволяє вийти з будь-якого типу циклу, не чекаючи закінчення його ітерацій. Давайте розглянемо простий приклад:
PS С:\> $i=0; while ($true) {if ($i++ -ge 3) { break } $i } 1 2 3
Умовою циклу whi1e в цьому випадку є логічна постійна $true, тому цей цикл ніколи не закінчиться. Оператор Break, який спрацьовує, коли змінна досягає $i значення 3, дозволяє вийти з цього циклу.
Оператор Continue переходить до наступної ітерації будь-якого типу циклу. Наприклад:
PS С:\> for ($i=0; $i -le 5; $i++) { if ($i -ge 4) { continue } $i } 0 1 2 3
У цьому прикладі відображається лише число від 0 до Z, оскільки для значень змінної, $i більших або рівних 4, спрацьовує оператор Продовжити.
PowerShell підтримує можливість негайного виходу або переходу до наступної ітерації не тільки для одного циклу, але і для вкладених циклів. Для цього циклам присвоюються спеціальні мітки, які вказуються на початку рядка перед ключовим словом, що визначає цикл певного типу. Потім ці мітки можна використовувати у вкладених циклах у поєднанні з операторами Break або Continu, вказуючи, на який цикл мають діяти оператори.
Давайте розглянемо простий приклад:
PS С:\> :outer while ( $true ) { » while ( $true ) { » break outer » } » } »
Тут оператор Break виходить із зовнішнього циклу, позначеного як зовнішній. Якби етикетка не була вказана, зовнішня петля ніколи б не закінчилася.
Інструкція Switch, яка об’єднує кілька перевірок умов в рамках однієї конструкції, доступна на багатьох мовах програмування.
Однак в PowerShell ця інструкція має потужні додаткові можливості:
Можна використовувати як аналог циклу, перевіряючи значення не окремого елемента, а цілого масиву;
Може перевіряти елементи на відповідність шаблону узагальнення або регулярних виразів;
Може обробляти текстові файли, використовуючи рядки з файлів як елементи, що перевіряються.
Типи перевірок всередині комутатора
Спочатку давайте розглянемо найпростішу форму оператора Switch, де один скалярний вираз по черзі зіставляється з декількома умовами.
Наприклад:
PS С:\> $а = 3 PS С:\> switch ($а) { 1 {"Один”} 2 {’’Два"} » » » 3 {"Три"} 4 {"Четыре"} » } » Три
У цьому прикладі значення змінної $a послідовно порівнюється з числами 1, 2, 3 і 4. При наявності збігу виконується відповідний блок коду, заданий фігурними дужками (в нашому випадку просто відображається рядок).
Якщо для перевіряється значення справедливі кілька умов зі списку, то будуть виконані всі дії, зіставлені з цими умовами.
Наприклад:
PS С:\> $а = 3 PS С:\> switch ($а) { >> 1 ("Один"} >> 2 {"Два"} >> 3 {"Три"} » 4 {"Четыре"} » 3 {"Еще раз три"} » } » Три Еще раз три Если нужно ограничиться только первым совпадением, то следует применить инструкцию Break: PS С:\> $а = 3 PS С:\> switch ($а) { » 1 {"Один"} » » » » » } 2 {"Два"} 3 {"Три"; break} 4 {"Четыре"} 3 {"Еще раз три"} Три В данном случае проверка условий внутри switch прерывается после нахождения первого соответствия. Если ни одно соответствие не найдено, то инструкция Switch не выполняет никаких действий: PS С:\> switch (3) { » 1 {"Один"} » 2 {"Два"} >> 4 {"Четыре"} » } » PS С:\> С помощью ключевого слова default можно задать действие по умолчанию, которое будет выполняться в том случае, когда не найдено ни одного соответствия. Например: PS С:\> switch (3) { >> 1 {"Один"} » 2 {"Два"} 168 Часть II. PowerShell как язык программирования » default {"Ни один, ни два") » } » Ни один, ни два
За замовчуванням оператор Switch порівнюється безпосередньо з об’єктами, указаними в умові.
У цьому випадку рядки нечутливі до регістру, наприклад:
PS С:\> switch ('абв') { » 'абв' {"Первое совпадение"} » 'АБВ' {"Второе совпадение"} » } » Первое совпадение Второе совпадение Если при сравнении следует учесть регистр символов, то нужно указать параметр - casesensitive: PS С:\> switch -casesensitive ('абв') { » 'абв' {"Первое совпадение"} » ’ЛЕВ' {"Второе совпадение"} » } » Первое совпадение Кроме обычного сравнения может проверять элементы на соответствие шаблону с подстановочными символами. Для этого используется переключатель -wildcard, например: PS С:\> switch -wildcard ('абв') { » 'а*' {"Начинается с а"} >> '*в' {"Оканчивается на в"} » } » Начинается с а Оканчивается на в Проверяемый элемент (объект) доступен внутри инструкции switch через специальную переменную $_ (напомним, что в переменной с таким названием сохраняется и текущий элемент, передаваемый по конвейеру от одного командлета другому). Например: PS С:\> switch -wildcard ('абв') { » 'а*' {"$_ начинается с а"} » '*в' {"$_ оканчивается на в"} » } » абв начинается с а абв оканчивается на в
Як бачите, змінна $ в рядку в подвійних лапках замінюється рядком, відповідної перевіряється значення.Перемикач -regex дозволяє перевіряти елементи на відповідність шаблону, який містить регулярні вирази (питання, пов’язані з регулярними виразами, обговорювалися раніше в цьому розділі).
Наприклад, попередній приклад можна записати в такий спосіб:
PS С:\> switch -regex ('абв') { » 'Аа’ {"$_ начинается с а"} » 'в$' {"$_ оканчивается на в"} » } » абв начинается с а абв оканчивается на в
Крім перевірок на просту відповідність або відповідність шаблонів, інструкція Switch дозволяє виконувати більш складні перевірки, вказуючи на блоки коду PowerShell замість шаблонів. У цьому випадку значення, що перевіряється, знову доступне через змінну $.
Давайте розглянемо приклад:
PS С:\> switch (10) { » {$_ -gt 5} {"$_ больше 5") » {$_ -It 20} {”$_ меньше 20"} » 10 {"$_ равно 10"} » } » 10 больше 5 10 меньше 20 10 равно 10
При цьому виконуються всі три умови: значення перших двох виразів -gt 5″ і -1t 20″ мають значення True, третя умова – звичайне порівняння двох чисел для рівності (10 дорівнює 10).
Поки що всі значення, які ми перевірили в операторі Switch, були скалярними величинами. Мова PowerShell дозволяє використовувати масиви елементів в якості перевіряється значення, причому масиви можуть бути вказані або явно, або отримані в результаті виконання команди або читання рядків з текстового файлу.
Давайте розглянемо приклад:
PS С:\> switch (1,2,3,4,5,6) { » {$_ % 3} {"$_ не делится на три"} » default {"$_ делится на чри"} » } » 1 не делится на три 2 не делится на три 3 делится на три 4 не делится на три 5 не делится на три 6 делится на три
У цьому випадку масив цілих чисел задається явним перебором його елементів. Всі елементи масиву перевіряються по черзі всередині оператора Switch: якщо залишок від ділення поточного елемента на 3 не дорівнює нулю, то виводиться повідомлення «$ не ділиться на три», де замість $_ підставляється значення перевіряється, як зазвичай. В іншому випадку виводиться повідомлення «$ ділиться на три»
Ось ще один приклад, коли масив елементів, які потрібно перевірити, є результатом команди PowerShell. Давайте повинні дізнатися кількість файлів з розширеннями txt і log, розташованих в системному каталозі Windows. Спочатку скиньте змінні лічильника:
PS С:\> $txt = $1од = О
Тепер давайте виконаємо відповідну інструкцію Switch. Отримуємо колекцію файлів з системного каталогу Windows за допомогою команди dir $env: SystemRoot (нагадаємо, що шлях до потрібної директорії зберігається в змінній середовища SystemRoot). Файли з розширеннями txt і log будуть відібрані шляхом перевірки на відповідність підстановочним шаблонам .txt і *.log відповідно) і у відповідних блоках коду ми збільшимо значення змінних $txt і $1od:
PS С:\> switch -wildcard (dir $env:SystemRoot) { » *.txt ($txt++) >> *.log {$log++} » } » Выведем теперь значения переменных $txt и $iog: PS C:\> "txt-файлы: $txt log-файлы: $log" txt-файлы: 21 log-файлы: 156
Щоб використовувати рядки з конкретного текстового файлу в якості вхідного масиву, потрібно вказати параметр -fi1e і шлях до потрібного файлу в інструкції Switch. Давайте розглянемо приклад. Припустимо, в системному каталозі Windows є файл kB946627.log з протоколом установки чергового оновлення операційної системи. Використовуйте оператор Switch для друку всіх рядків з цього файлу, які містять підрядки “Source:” або “Destinantion:” (використовуються параметри -wi1dcard і -fi1e, рядки з файлу звіряються з шаблоном узагальнення):
PS С:\> switch -widlcard -file $env:SystemRoot\KB946627.log { >> *Source:* {$_} >> *Destination:* {$_} » } » 10.281: Source:C:\WINDOWS\system32\SET32.tmp (5.1.2600.3173) 10.281: Destination:С:\WINDOWS\system32\rpcrt4.dll (5.1.2600.2180) 10.281: Source:C:\WINDOWS\system32\SETDB.tmp (5.1.2600.3243) 10.281: Destination^:\WINDOWS\system32\xpsp3res.dll (5.1.2600.3132) 10.281: Source:C:\WINDOWS\system32\SET9E.tmp (6.0.2900.3231) 10.281: Destination:^\WINDOWS\system32\wininet.dll (6.0.2900.3132) 10.281: Source:C:\WINDOWS\system32\SET9F.tmp (6.0.2900.3231) 10.281: Destination:C:\WINDOWS\system32\urlmon.dll (6.0.2900.3132)
Оператори PowerShell є поліморфними, і один і той же оператор може бути застосований до різних типів об’єктів.
Поведінка більшості бінарних операторів визначається «правилом лівші». Тип операнда зліва вказує тип результату дії оператора.
PowerShell підтримує C-подібні оператори призначення сполук.
Оператори порівняння задаються в PowerShell за допомогою скорочень символів, < та > символи не використовуються.
Підтримуються два варіанти операторів перевірки рядків: шаблони підстановки та регулярні вирази.
PowerShell підтримує стандартні інструкції управління для розгалуження та циклічності.
Інструкція Switch в PowerShell має більше можливостей, ніж аналогічні конструкції в інших мовах програмування. За допомогою одного перемикача, без додаткового циклу, ви можете перевірити елементи масиву або рядка з текстового файлу на відповідність шаблону.
Ви можете обробляти колекції об’єктів за допомогою циклів або конвеєрів. Цикли, як правило, споживають більше пам’яті, але операції виконуються швидше, ніж конвеєри.
Дякуємо нашій команді волонтерів за надану інформацію з відкритих джерел.