Заметки о Windows и других программных продуктах Microsoft...

Использование оператора Switch в PowerShell

Использование оператора Switch в PowerShell

Обычно для проверки какого либо условия в PowerShell используется конструкция If — Else. Напомню, что оператор If предназначен для проверки условия и выполнения определенного действия, связанного с этим условием. Если заданное условие соблюдено, то выполняем одно действие, если не соблюдено — то другое.

В принципе в одном скрипте подобную проверку можно выполнять неограниченное число раз, однако если условий много, то использование If становится несколько неудобным.

Поэтому при большом количестве проверяемых условий лучше применять оператор Switch, который позволяет объединять список условий в одной инструкции. Switch поочередно сопоставляет проверяемое значение (value) с каждым заданным условием (condition), и если находит совпадение, то выполняет действие (action), связанное с этим условием. Синтаксис выглядит так:

Switch (value) {
condition 1 {action}
condition 2 {action}
condition n {action}}

В качестве простого примера возьмем скрипт, в котором производится проверка значения переменной $a на соответствие одному из трех значений. При совпадении выводится найденное значение переменной:

$a = 1
Switch ($a) {
1 {″one″}
2 {″two″}
3 {″three″}}
Write-Host ″switched″

пример работы switch

 

Как видно из предыдущего примера, действие производится только при совпадении значений. Если вы хотите, чтобы действие выполнялось и при отсутствии совпадений, то можно указать ключевое слово Default.  В этом случае если ни одно из условий не будет выполнено, то будет произведено действие по умолчанию, указанное после Default. Например:

$a = 4
Switch ($a) {
1 {″one″}
2 {″two″}
3 {″three″}
Default {″Out of range″; exit}
}
Write-Host ″switched″

применение Default в конструкции switch

 

Может быть так, что в списке окажется несколько одинаковых условий, как в следующем примере:

$a = 1
switch ($a) {
1 {″one″}
2 {″two″}
3 {″three″}
1 {″another one″}
DEFAULT {″Out of range″; exit}
}
Write-Host ″switched″

несколько совпадений в конструкции switch

 

Как видите, в этом случае оператор Switch выполнил оба действия. Если значение переменной совпало с одним из условий и код выполнился, обработка не прерывается, а производится сравнение со следующим условием и так далее. Избежать этого можно с помощью ключевых слов Break и Continue.

Указанное в конце инструкции, Break предписывает в случае совпадения прекратить дальнейший поиск и выполнить указанное действие. Ключевое слово Break означает, что обработка больше не выполняется и оператор Switch завершает свою работу.

$a = 1
switch ($a) {
1 {″one″, break}
2 {″two″}
3 {″three″}
1 {″another one″}
DEFAULT {″Out of range″; exit}
}
Write-Host ″switched″

Ключевое слово Continue указывает, что обработка текущего условия завершена и не будет продолжаться, после чего начнется поиск следующего условия. Т.е. в отличие от Break, Continue не завершает работу Switch, а переходит к следующему условию:

$a = 1
switch ($a) {
1 {″one″, continue}
2 {″two″}
3 {″three″}
1 {″another one″}
DEFAULT {″Out of range″; exit}
}
Write-Host ″switched″

 

Switch позволяет работать не только с константами. Так в качестве проверяемого значения можно указать одно выражение PowerShell, а вместо условия — другое. Для примера проверим состояние сервиса Spooler, и если он в выключенном состоянии, то включим его:

switch (Get-Service | where {$_.name -eq ″spooler″}) {
{$_.status -eq ″Running″} {″Service is running″}
{$_.status -eq ″Stopped″} {″Service is stopped, starting…″; Start-Service  spooler}
}

сложное условие для оператора switch

 

Еще оператор Switch имеет несколько дополнительных параметров, предназначенных для обработки строк:

Exact — условие является строкой и должно точно соответствовать критерию;
Wildcard — условие является строкой, содержащей подстановочные символы;
Regex — условие содержит регулярные выражения;
CaseSensitive — условие чувствительно к регистру. Если условие не является строкой, то параметр игнорируется;
File — условие берется из файла.

Для примера возьмем текстовый файл с отрывком из ″Хоббита″, а в условии используем подстановочные символы. Условие срабатывает при каждом нахождении слов Hobbit и Baggins:

$content = Get-Content C:\Files\Hobbit.txt
Switch -Wildcard ($content) {
″*Hob*″ {″Word Hobbit is found″}
″*Bagg*″ {″Word Baggins is found″}
}

использование wildcards в конструкции switch

 

В статье я привел лишь несколько простых примеров. На самом деле возможности Switch гораздо шире, особенно в сочетании с регулярными выражениями. Но это уже совсем другая история 🙂

 
 
Комментарии
Александр

Спасибо за статью — очень пригодилась, но есть маленький нюанс:
У вас при использовании ключевого слова Break указан пример:
1 {″one″, break} — перед break стоит запятая.

Сейчас нет возможности проверить в более ранних версиях, но у меня в PS5 ключевое слово break нормально отрабатывается только если указано после ; (точки с запятой)

Спасибо!все доходчиво и понятно!