Как использовать оператор Switch в PowerShell
Оператор Switch в PowerShell позволяет проверять несколько условий. Вы можете сравнивать оператор switch с несколькими операторами if, только в более простом и понятном виде.
Что большинство людей не знают, так это то, что оператор switch не ограничивается одним условием. На самом деле вы можете выполнять несколько условий и одновременно проверять несколько значений. Использование оператора switch предпочтительнее, чем использование нескольких операторов If, потому что это упрощает чтение и поддержку вашего кода.
В этой статье мы рассмотрим, как использовать оператор Switch в PowerShell и как максимально эффективно его использовать.
Использование оператора Switch в PowerShell
Давайте сначала рассмотрим основные особенности использования оператора Switch в PowerShell. Оператор switch сравнивает значение с несколькими условиями. Если условие выполняется, то код в скриптовом блоке выполняется.
В приведенном ниже примере у нас есть переменная $car. Оператор switch проверит, соответствует ли переменная car одному из условий. Когда условие выполнено, блок скрипта будет выполнен, и в данном случае он выведет строку в консоль. Если совпадений не найдено, то выполняется условие по умолчанию.
$car = "Toyota"
switch ($car) {
"Toyota" {
Write-Host "The car is a Toyota."
}
"Honda" {
Write-Host "The car is a Honda."
}
"Ford" {
Write-Host "The car is a Ford."
}
default {
Write-Host "The car is not recognized."
}
}
Result
The car is a Toyota.
Условия не ограничиваются строками или числами, мы также можем использовать сравнения в условии. Например, если мы хотим проверить, является ли число меньше определенного значения:
$value = 5
switch ($value) {
{$_ -le 10} {
Write-Host "The input is lower then 10"
}
{$_ -le 20} {
Write-Host "The input is lower then 20"
}
}
Result
The input is lower then 10
The input is lower then 20Теперь, если вы запустите приведенный выше код, вы заметите, что оба условия выполняются. И это правильно, потому что значение 5 не только меньше 10 (первое условие), но и меньше 20. Чтобы предотвратить выполнение обоих условий, мы можем использовать оператор break. Таким образом, оператор switch прекратит проверку условий, если будет найдено соответствие:
$value = 5
switch ($value) {
{$_ -le 10} {
Write-Host "The input is lower then 10";
Break
}
{$_ -le 20} {
Write-Host "The input is lower then 20";
Break
}
}
Result
The input is lower then 10Переключить несколько значений
В операторе switch в PowerShell мы также можем тестировать несколько значений вместо этого. Для этого вам нужно будет разделить значения запятыми. Каждое значение затем будет проверяться на соответствие условиям внутри оператора switch.
Например, у нас есть список фруктов, и мы хотим знать, какие фрукты у нас есть:
$fruit = "grape","kiwi","pear"
switch ($fruit) {
"apple" { Write-Host "We have an apple." }
"orange" { Write-Host "We have an orange." }
"banana" { Write-Host "We have a banana." }
"pear" { Write-Host "We have a pear." }
"strawberry" { Write-Host "We have a strawberry." }
"grape" { Write-Host "We have a grape." }
"mango" { Write-Host "We have a mango." }
"kiwi" { Write-Host "We have a kiwi." }
"pineapple" { Write-Host "We have a pineapple." }
"watermelon" { Write-Host "We have a watermelon." }
default { Write-Host "The fruit is not recognized." }
}
Result
We have a grape.
We have a kiwi.
We have a pear.Параметры переключателя PowerShell
Операторы Switch в PowerShell имеют несколько параметров, которые мы можем использовать для определения того, как будет проверяться значение:
- Подстановочные знаки – Вы можете использовать символы подстановки, такие как * и ? в своих условиях.
- Чувствительно к регистру - Указывает, что условия чувствительны к регистру. По умолчанию условия нечувствительны к регистру.
- Точный – Включено по умолчанию. Оператор switch всегда будет выполнять точное сравнение, только если вы не используете параметр подстановки.
- Regex – Указывает, что каждое условие рассматривается как регулярное выражение.
File
- Позволяет использовать файл для значения. Таким образом, вы можете проверить, соответствуют ли содержимое файла одним из условий.
Дикий символ
Параметр Wildcard позволяет использовать подстановочные знаки в ваших условиях. Таким образом, только часть строки должна соответствовать значению, а не полное совпадение. Вы можете использовать *, чтобы проверить, начинается ли строка или заканчивается указанными символами. А ? используется для замены одного символа:
$name = "John"
switch -Wildcard ($name) {
"Jo*" {
Write-Host "The name starts with 'Jo'."
}
"J?hn" {
Write-Host "The name looks like John."
}
"J*o*" {
Write-Host "The name contains 'J' and 'o'."
}
default {
Write-Host "The name does not match any pattern."
}
}CaseSensative
Оператор Switch в PowerShell по умолчанию не чувствителен к регистру. Но когда вы добавляете параметр casesensitive, значения должны сравниваться с учетом регистра:
$language = "PowerShell"
switch -CaseSensitive ($language) {
"powershell" {
Write-Host "The language is PowerShell in lower case."
}
"PowerShell" {
Write-Host "The language is PowerShell in mixed case."
}
"PYTHON" {
Write-Host "The language is Python in upper case."
}
default {
Write-Host "The language is not recognized."
}
}Регулярные выражения
Регулярные выражения - это отличный способ проверить, соответствуют ли строки определенному шаблону. Создание регулярных выражений иногда может быть несколько сложным, но они действительно довольно мощные. Когда вы указываете параметр регулярного выражения в операторе switch, то каждое условие рассматривается как строка регулярного выражения.
В представленном ниже примере мы проверяем, является ли ввод действительным адресом электронной почты, именем домена или номером телефона:
$input = "[email "
switch -Regex ($input) {
"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$" {
Write-Host "The input is a valid email address."
}
"^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$" {
Write-Host "The input is a valid domain name."
}
"^\+?[0-9]{1,3}\s?[0-9]{7,14}$" {
Write-Host "The input is a valid phone number."
}
default {
Write-Host "The input is not recognized."
}
}Файл
Менее известным, но все же очень мощным вариантом является параметр file в операторе Switch. Параметр file указывает, что значение — это файл. Таким образом, мы можем, например, проверить, соответствует ли содержимое файла одному из условий:
$file = "C:\Documents\example.txt"
switch -File $file {
{$_ -match "apple"} {
Write-Host "The file contains the word 'apple'."
}
{$_ -match "banana"} {
Write-Host "The file contains the word 'banana'."
}
{$_ -match "orange"} {
Write-Host "The file contains the word 'orange'."
}
default {
Write-Host "The file does not contain any recognized words."
}
}Другим вариантом является, например, перебор каталога с файлами. Затем мы можем проверить каждый файл на соответствие одному из типов файлов, указанных в условиях:
$path = "C:\Documents"
Get-ChildItem $path | ForEach-Object {
switch -File ($_.FullName) {
"*.txt" {
Write-Host "$($_.Name) is a text file."
}
"*.docx" {
Write-Host "$($_.Name) is a Word document."
}
"*.xlsx" {
Write-Host "$($_.Name) is an Excel workbook."
}
default {
Write-Host "$($_.Name) is not a recognized file type."
}
}
}Заключение
Когда вам необходимо использовать несколько операторов if в вашем скрипте, часто лучше использовать оператор Switch в PowerShell. Он позволяет легко сравнивать одно или несколько значений с несколькими условиями.
Надеюсь, эта статья помогла вам лучше понять оператор switch. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.