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

  • Михаил
  • 12 мин. на прочтение
  • 113
  • 13 Dec 2015
  • 13 Dec 2015

Обычно для проверки какого либо условия в 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″

 

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

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

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

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

Как видите, в этом случае оператор 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 имеет несколько дополнительных параметров, предназначенных для обработки строк:

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″}
 }

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