Поиск по сайту:

Как использовать оператор 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. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.