Вступ до справи відьом S у PowerShell
Функція перемикання в PowerShell використовується для обробки декількох операторів If або іншими словами, це заміна декількох умов If / Else If / Else. Щоб перевірити одну умову в Script або Function, ви можете використовувати оператор If / else, але якщо ви хочете оцінити більше операторів IF, тоді використовуйте Switch.
Перемикач краще порівняти з декількома операторами If і легко здійснити та просто використовувати для кодування. Під кожним твердженням існує кілька умов, і коли одна з них задовольняє, тоді виконується дія.
Синтаксис:
Switch ()
(
(Action1)
(Action2)
)
Повний синтаксис:
Switch (-regex | -wildcard | -exact ) ( -casesensitive ) ( ) (
"String" | Number | Variable | ( expression ) ( statementlist )
default ( statementlist )
)
АБО
Switch (-regex | -wildcard | -exact ) ( -casesensitive ) -file (filename)(
"String" | Number | Variable | ( expression ) ( statementlist )
default ( statementlist )
)
Параметри корпусу комутатора в PowerShell
- Регекс : Його також називають регулярним вираженням. Здійснює перевірку регулярних виразів на значення умови. Якщо ви використовуєте Regex, WildCard та Exacts ігноруються. Крім того, якщо пункт відповідності не є рядком, цей параметр ігнорується.
- Підстановка : вказує на те, що умовою є рядок, що містить підстановку. Якщо ви використовуєте Wildcard, Regex та Exacts, вони ігноруються. Крім того, якщо пункт відповідності не є рядком, цей параметр ігнорується.
- Точне : виконує збіг проти точного рядка. Якщо ви використовуєте Exact, Wildcard та Regex ігноруються, а якщо відповідне застереження не є рядком, цей параметр ігнорується.
- CaseSensitive: Цей параметр перевірятиме умову, яка відповідає точно переданому Значенню (залежно від регістру), якщо воно не відповідає, то цей параметр ігнорується. Також потрібне значення рядка.
- Файл : приймає шлях до файлу як вхідне значення, а не значення рядка. Якщо передано кілька параметрів файлу, він займає лише останній. Кожен рядок файлу читається та оцінюється відповідно до умови, і якщо умова відповідає, то він виконує це значення або відображає письмове повідомлення.
Блок-схема
Як працює комутатор у PowerShell?
Як показано на діаграмі вище, щоразу, коли будь-яке значення (рядок, Integer, float або інші типи даних), масив, макіяж, файли тощо передаються, то воно починає відповідати умовам по одному, і коли умова відповідає, сценарій виконує цей блок . Для кількох значень відповідності буде виконано кілька блоків скриптів, і якщо значення відповідності не знайдено, і якщо вказана умова за замовчуванням, то він виконує цей блок, інакше є нульовий вихід.
Приклади корпусу комутаторів в PowerShell
Давайте подивимось на наведеному прикладі:
Приклад №1
1. Проста функція комутації з переданим рядком, цілим значенням.
Код:
switch (3) (
1 ("One")
2 ("Two")
3 ("Three")
)
Вихід: три
Код:
switch("data")(
"abc"("Abc executed")
"xyz"("Xyz Executed")
"data"("Data Executed")
)
Вихід: Дані виконано
Тепер, що робити, якщо параметр не відповідає виразу. Як приклад, наведений нижче, 5 не відповідає жодному із випадків Switch. У цьому випадку вихід буде нульовим.
switch (5) (
1 ("One")
2 ("Two")
3 ("Three")
)
Щоб подолати вищевказану проблему, за замовчуванням потрібно вказати, а блок за замовчуванням виконується, коли жоден з параметрів не відповідає.
switch (5) (
1 ("One")
2 ("Two")
3 ("Three")
default("No Match Found")
)
Вихід: не знайдено відповідності
Приклад №2
Давайте подивимось на наведеному прикладі:
Різниця між if / else if / else та Switch. З наведеного нижче прикладу ви можете зрозуміти, як легко написати сценарій за допомогою функції Switch.
$time = 3
if($time -eq 1)("It's 1 O'Clock")
elseif ($time -eq 2) ("It's 2 O'Clock")
elseif ($time -eq 3) ("It's 3 O'Clock")
else ("No Match Found")
$time = 3
switch ($time) (
1 ("It's 1 O'Clock")
2 ("It's 2 O'Clock")
3 ("It's 3 O'Clock")
default("No Match found")
)
Вихід: це 3 O'Clock
Час виконання обох методів.
$time = 3
Measure-Command (
if($time -eq 1)("It's 1 O'Clock")
elseif ($time -eq 2) ("It's 2 O'Clock")
elseif ($time -eq 3) ("It's 3 O'Clock")
else ("No Match Found")
)
Загальна мілісекунда: 39.1416
$time = 3
Measure-Command (
switch ($time) (
1 ("It's 1 O'Clock")
2 ("It's 2 O'Clock")
3 ("It's 3 O'Clock")
default("No Match found")
)
)
Загальна мілісекунда: 25.6802
Різниця: 13, 4614 мілісекунд
Ця різниця стає величезною, коли ви пишете масивний скрипт або функції всередині комутатора.
1. Перемкнути параметр Regex
Якщо Regex згадується в комутаторі, він оцінює вираз з переданим значенням, і якщо частина умови відповідає, то він виконує цю операцію.
Розглянемо приклад нижче.
Код:
Switch ("Donkey")(
"Dog" ("Dog is Mentioned")
"Cat" ("Cat is Mentioned")
"Don" ("Donkey is Mentioned")
"key" ("Donkey is mentioned again")
default ("Nothing is mentioned")
)
Вихід: нічого не згадується
Після додавання Regex.
Код:
Switch -Regex ("Donkey")(
"Dog" ("Dog is Mentioned")
"Cat" ("Cat is Mentioned")
"Don" ("Donkey is Mentioned")
"key" ("Donkey is mentioned again")
default ("Nothing is mentioned")
)
Вихід : Осел згадується
Знову згадується осел
2. Перемкнути параметр Wildcard
Підстановка працює аналогічно параметру Like.
Код:
$msg = "Error, WMI connection failed"
Switch -Wildcard ($msg) (
"Error*" ("WMI Error")
"Warning*" ("WMI Warning")
"Successful*" ("WMI Connection Successful")
)
Вихід: помилка WMI
3. Переключіться з точним параметром
Точна функція за замовчуванням в Switch. Не має значення, використовуєте ви його чи ні. Але якщо ви використовуєте два параметри одночасно, останній параметр має перевагу.
Код:
Switch -Regex -Exact ("Hello")(
"He" ("Hello World")
"Hi" ("Hi World")
Default ("No World")
)
Вихід: немає світу
Код:
Switch -Exact -Regex ("Hello")(
"He" ("Hello World")
"Hi" ("Hi World")
Default ("No World")
)
Вихід: Hello World
4. Переключіться з параметром файлу
Ви можете надати шлях до файлу безпосередньо до комутатора як параметр. Ви можете використовувати файл із шляхом до файлу, а не надавати йому змінний вираз.
Код:
Switch -Wildcard -File C:\temp\switchtest.txt (
"*Warning*"(Write-Warning $PSItem)
"*Error*"(Write-Error $PSItem)
)
Вихід:
Ви можете використовувати $ PSItem або $ _ для роботи з поточними елементами.
5. Переключіться з параметром CaseSensitive
Якщо ви використовуєте параметр Casesensitive в комутаторі, тоді умова повинна точно відповідати кожному символу.
Код:
switch -CaseSensitive ("Hello") (
"HeLlo" ("This is different HeLlo")
Default ("This is not Matching")
)
Вихід: це не відповідає
6. Передача значення масиву для переключення функції
Простий масив:
switch (10, 12) (
9 ( "Nine" )
10 ( "Ten" )
11 ("Eleven")
12 ("Twelve")
Default ("None")
)
Вихід:
Десять
Дванадцять
Проходження об’єкта масиву
Код:
$VMOps = @(
"VM_Delete"
"VM_Create"
)
switch ($VMops) (
"VM_Delete" ("VM Delete Operation")
"VM_Create" ("VM Create Operation")
"VM_Shutdown" ("VM Shutdown Operation")
)
Вихід:
Операція видалення VM
VM Створення операції
7. Умова перерви
Коли ви вказуєте умову розриву, операція переривається в цьому циклі і не може продовжувати подальше виконання. Це дуже корисно, коли ви не хочете перевіряти подальші кроки, коли умова задовольняється, а час виконання стає швидшим.
Код:
$VMOps = @(
"VM_Delete"
"VM_Create"
)
switch ($VMops) (
"VM_Delete" (
"VM Delete Operation"
break )
"VM_Create" (
"VM Create Operation"
break)
"VM_Shutdown" (
"VM Shutdown Operation"
break
)
)
Вихід:
Операція видалення VM
Якщо ви помітили, виконується лише один блок, і він виходить із функції комутатора.
8. Продовжуйте стан
Параметр «Продовжити» використовується для пропуску конкретної ітерації. Наприклад, якщо є 3 елементи, то вони виконуватимуться спочатку, а коли умова відповідає, то він буде пропускати інші кроки та переходити до наступного кроку.
Код:
switch ('Hello') (
"hello" ('First Block Executes'
continue)
'HELLO' ('Second Block Executes'
continue )
'HeLLo' ('Third Block Exectues'
continue )
Default ('Nothing executed')
)
Вихід: перший блок виконує
Як ви бачите, що переданий лише один аргумент ("Привіт"), він виконує перший блок лише тому, що вираз відповідає і не залишається іншого аргументу для виконання, сценарій закінчиться.
- Ще один змішаний приклад перерви та продовження з Switch.
Код:
switch ('Alpha', 'Beta', 'Delta') (
"Alpha" ('First Block Executes'
continue)
'Beta' ('Second Block Executes'
break )
'Delta' ('This will not Execute')
)
Вихід:
Перший блок виконує
Другий блок виконує
Висновок
Загалом, Switch набагато краще, ніж реалізація декількох умов If і забезпечує більше функціональності та скорочення часу виконання.
Рекомендовані статті
Це було керівництвом по переключенню Case в PowerShell. Тут ми також обговорюємо синтаксис, параметри та приклади випадку перемикання в Powershell. Ви також можете переглянути наступні статті, щоб дізнатися більше -
- Що таке сценарій оболонки?
- Команди PowerShell
- Оператори PowerShell
- Використання Powershell
- Керівництво по масиву в PowerShell з прикладами