Продолжаем разбирать управляющие инструкции в Windows PowerShell. Предыдущие части статьи вы можете найти здесь и здесь.
Инструкция Switch
Инструкция Switch объединяет несколько проверок условий внутри одной конструкции. В PowerShell эта Switch обладает широкими возможностями, а именно:
- может использоваться как аналог цикла, проверяя не один элемент, а целый массив;
- может проверять элементы на соответствие шаблону с подстановочными символами или регулярными выражениями;
- может обрабатывать текстовые файлы, используя в качестве проверяемых элементов строки из файла.
Итак, для начала рассмотрим самый простой вариант, когда одно скалярное выражение по очереди сопоставляется с несколькими условиями.
$a = 2 Switch ($a) { 1 {"Один"} 2 {"Два"} 3 {"Три"} }
Здесь значение переменной $a последовательно сравнивается с числами 1, 2 и 3. При совпадении значений, отрабатывается блок кода в фигурных скобках.
Если проверяемое значение совпадает с несколькими значениями из списка, то будет выполнен весь код.
$a = 1
Switch ($a) {
1 {"Один"}
2 {"Два"}
3 {"Три"}
1 {"И еще раз один"}
}
Если нужно ограничиться только первым совпадениям, то тут нам поможет функция Break.
$a = 1
Switch ($a) {
1 {"Один"; Break}
2 {"Два"}
3 {"Три"}
1 {"И еще раз один"}
}
Если ни одно соответствие не будет найдено, инструкция Switch не выполнит никаких действий.
$a = 1
Switch ($a) {
2 {"Два"}
3 {"Три"}
}
Если не найдено ни одного соответствия, мы можем задать действие, выполняемое в данном случае, при помощи команды Default.
Switch (5) {
1 {"Один"}
2 {"Два"}
3 {"Три"}
Default {"Совпадений нет"}
}
Нужно отметить, что сравнение происходит без учета регистра.
Если регистр всё же нужно учитывать, то сделать это при помощи параметра -CaseSensitive.
Switch -CaseSensitive ('abc') {
'abc' {"Раз"}
'ABC' {"Два"}
}
Можно проверять элементы на соответствие шаблону. Для этого используется параметр -Wildcard.
Switch -Wildcard ('abc') {
'a*' {"Начинается с a"}
'*c' {"Оканчивается на c"}
}
Как и предыдущих примерах, проверяемому объекту соответствует переменная $_. В этом мы можем убедиться через следующий пример:
Switch -Wildcard ('abc') {
Если мы проверяем регулярные выражения, то предыдущий пример будет иметь вид:
Switch -Regex ('abc') {
'^a' {"$_ начинается с a"}
'c$' {"$_ оканчивается на c"}
}
Кроме проверок на простое совпадение или соответствие шаблону, PowerShell позволяет выполнять более сложные проверки, указывая вместо шаблонов блоки кода.
Switch (7) {
{$_ -gt 3} {"$_ больше 3"}
{$_ -lt 10} {"$_ меньше 10"}
7 {"$_ равно 7"}
}
Язык PowerShell допускает использование в качестве проверяемых значений массивов элементов. При этом массивы могут быть заданы явно или использованы путём считывания строк из текстового файла.
Switch -Wildcard (dir $env:SystemRoot) {
*.txt {$txt++}
*.log {$log++}
}
В данном случае мы просматриваем файлы системного каталога при помощи dir $env:SystemRoot. Отбираются файлы с расширением .txt и .log. Количество этих файлов суммируется и выводится по команде «txt-файлы: $txt log-файлы: $log».
Для использования в качестве массива строк из определённого файла нужно указать параметр -File и путь к этому файлу.
Итак, пусть в системном каталоге есть файл DPINST.LOG, и нам нужно вывести все строки, содержащие слово Install.
Switch -Wildcard -File $env:SystemRoot\DPINST.LOG {
*Install* {$_}
}
Для этого мы используем параметры -Wildcard и -File, указываем путь к файлу и искомое слово в переменной $_.
На этом обширная тема логических операторов и управляющих инструкций завершена. 🙂
Статьи по теме: