Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Краткое описание
Объясняет, как использовать переключатель для обработки нескольких if
инструкций.
Подробное описание
Чтобы проверить условие в скрипте или функции, используйте инструкцию if
. Инструкция if
может проверять множество типов условий, включая значение переменных и свойства объектов.
Чтобы проверить несколько условий, используйте инструкцию switch
. Оператор switch
эквивалентен ряду операторов if
, но это проще. Инструкция switch
перечисляет каждое условие и необязательное действие. При получении условия выполняется действие.
Оператор switch
может использовать $_
и $switch
автоматические переменные. Дополнительные сведения см. в статье about_Automatic_Variables.
Синтаксис
Базовый switch
оператор имеет следующий формат:
switch (<test-expression>)
{
<result1-to-be-matched> {<action>}
<result2-to-be-matched> {<action>}
}
Эквивалентные if
операторы:
if (<result1-to-be-matched> -eq (<test-expression>)) {<action>}
if (<result2-to-be-matched> -eq (<test-expression>)) {<action>}
<test-expression>
— это одно выражение, которое вычисляется в режиме выражения для возврата значения.
Это <result-to-be-matched>
выражение, значение которого сравнивается с входным значением. Выражения включают литеральные значения (строки или числа), переменные и блоки скриптов, возвращающие логическое значение.
Любое неквалированное значение, которое не распознается как число, рассматривается как строка.
Чтобы избежать путаницы или непреднамеренного преобразования строк, всегда следует кавычекировать строковые значения. Заключайте все выражения в скобки ()
, создавая вложенные выражения, чтобы убедиться, что выражение вычисляется правильно.
Важно понимать, что значение <result-to-be-matched>
находится в левой части выражения сравнения. Это означает, что результат <test-expression>
находится в правой части, которая может быть преобразована в тип левого значения для сравнения. Дополнительные сведения см. в about_Comparison_Operators
Значение default
зарезервировано для действия, используемого при отсутствии других совпадений.
Автоматическая $_
переменная содержит значение выражения, переданного switch
инструкции, и доступно для оценки и использования в пределах области инструкций <result-to-be-matched>
.
switch
Полный синтаксис инструкции выглядит следующим образом:
switch [-Regex | -Wildcard | -Exact] [-CaseSensitive] (<test-expression>) {
string | number | variable | { <value-scriptblock> }
{ <action-scriptblock> }
default { <action-scriptblock> } # optional
}
or
switch [-Regex | -Wildcard | -Exact] [-CaseSensitive] -File filename {
string | number | variable | { <value-scriptblock> }
{ <action-scriptblock> }
default { <action-scriptblock> } # optional
}
Если параметры не используются, switch
ведет себя так же, как и с помощью параметра Exact. Он выполняет нечувствительное совпадение регистра для значения. Если значение является коллекцией, каждый элемент вычисляется в том порядке, в котором он отображается.
Оператор switch
должен содержать по крайней мере одну инструкцию условия.
Предложение default
активируется, если значение не соответствует ни одному из условий. Это эквивалентно предложению else
в инструкции if
. В каждой default
инструкции разрешено только одно switch
предложение.
switch
имеет следующие параметры:
- Подстановочный знак — указывает, что условие является подстановочным знаком . Если предложение match не является строкой, параметр игнорируется. При сравнении учитывается регистр букв.
- Точное — указывает, что предложение соответствия, если это строка, должно соответствовать точно. Если предложение match не является строкой, этот параметр игнорируется. При сравнении учитывается регистр букв.
- CaseSensitive — выполняет сопоставление с учетом регистра. Если предложение match не является строкой, этот параметр игнорируется.
-
файл — принимает входные данные из файла, а не
<test-expression>
. Файл считывается по строке за раз и оценивается операторомswitch
. По умолчанию сравнение не учитывает регистр. Параметр файла поддерживает только один файл. Если включены несколько параметров файла , используется только последний. Дополнительные сведения см. в примерах параметров файла. -
Regex — выполняет регулярное выражение, соответствующее значению условия. Если предложение match не является строкой, этот параметр игнорируется.
При сравнении учитывается регистр букв. Автоматическая
$Matches
переменная доступна для использования в блоке инструкций сопоставления.
Примечание.
При указании конфликтующих значений, таких как Regex и Подстановочный знак, последний указанный параметр имеет приоритет, и все конфликтующие параметры игнорируются. Также разрешено несколько экземпляров параметров. Однако используется только последний указанный параметр.
Простые примеры сопоставления
В следующем примере оператор switch
сравнивает значение теста 3
с каждым из условий. Когда тестовое значение соответствует условию, выполняется действие.
switch (3) {
1 { "It's one." }
2 { "It's two." }
3 { "It's three." }
4 { "It's four." }
}
It's three.
В этом примере значение сравнивается с каждым условием в списке. В приведенном ниже операторе switch
есть два условия для значения 3, которое показывает, что все условия тестируются.
switch (3) {
1 { "It's one." }
2 { "It's two." }
3 { "It's three." }
4 { "It's four." }
3 { "Three again." }
}
It's three.
Three again.
Чтобы направить switch
оператор для остановки сравнения после совпадения, используйте инструкцию break
. Оператор break
завершает инструкцию switch
.
switch (3) {
1 { "It's one." }
2 { "It's two." }
3 { "It's three."; break }
4 { "It's four." }
3 { "Three again." }
}
It's three.
Если тестовое значение является коллекцией, например массивом, каждый элемент в коллекции вычисляется в том порядке, в котором он отображается. В следующих примерах вычисляется 4, а затем 2.
switch (4, 2) {
1 { "It's one." }
2 { "It's two." }
3 { "It's three." }
4 { "It's four." }
3 { "Three again." }
}
It's four.
It's two.
Все break
инструкции применяются к коллекции, а не к каждому значению, как показано в следующем примере. Оператор switch
завершается оператором break
в условии 4.
switch (4, 2) {
1 { "It's one."; break }
2 { "It's two." ; break }
3 { "It's three." ; break }
4 { "It's four." ; break }
3 { "Three again." }
}
It's four.
Более сложные примеры соответствия
В этом примере switch
инструкция проверяет тип значения в хэш-файле. Необходимо использовать и выражение, возвращающее логическое значение, чтобы выбрать блок скрипта для выполнения.
$var = @{A = 10; B = 'abc'}
foreach ($key in $var.Keys) {
switch ($var[$key].GetType()) {
{ $_ -eq [int32] } { "$key + 10 = $($var[$key] + 10)" }
{ $_ -eq [string] } { "$key = $($var[$key])" }
}
}
A + 10 = 20
B = abc
В этом примере объект, который не является строкой или числовыми данными, передается в объект switch
. Выполняет switch
строковое приведение объекта и оценивает результат.
$test = @{
Test = 'test'
Test2 = 'test2'
}
$test.ToString()
switch -Exact ($test) {
'System.Collections.Hashtable' { 'Hashtable string coercion' }
'test' { 'Hashtable value' }
}
System.Collections.Hashtable
Hashtable string coercion
В этом примере нет соответствующего случая, поэтому выходные данные отсутствуют.
switch ("fourteen") {
1 { "It's one."; break }
2 { "It's two."; break }
3 { "It's three."; break }
4 { "It's four."; break }
"fo*" { "That's too many." }
}
default
Добавив предложение, можно выполнить действие, если другие условия не будут выполнены.
switch ("fourteen") {
1 { "It's one."; break }
2 { "It's two."; break }
3 { "It's three."; break }
4 { "It's four."; break }
"fo*" { "That's too many." }
default { "No matches" }
}
No matches
Чтобы слово fourteen
соответствовало варианту, необходимо использовать параметр -Wildcard
или -Regex
.
switch -Wildcard ("fourteen") {
1 { "It's one."; break }
2 { "It's two."; break }
3 { "It's three."; break }
4 { "It's four."; break }
"fo*" { "That's too many." }
}
That's too many.
В следующем примере используется -Regex
параметр.
$target = 'https://bing.com'
switch -Regex ($target) {
'^ftp\://.*$'
{
"$_ is an ftp address"
break
}
'^\w+@\w+\.com|edu|org$'
{
"$_ is an email address"
break
}
'^(http[s]?)\://.*$'
{
"$_ is a web address that uses $($Matches[1])"
break
}
}
https://bing.com is a web address that uses https
В следующем примере показано использование блоков скриптов в качестве switch
условий инструкции.
switch ("Test") {
{ $_ -is [string] } { "Found a string" }
"Test" { "This $_ executes as well" }
}
Found a string
This Test executes as well
В следующем примере выполняется обработка массива, содержащего два значения даты. Свойство <value-scriptblock>
Year сравнивается с каждой датой. Отображается <action-scriptblock>
приветственное сообщение или количество дней до начала 2022 года.
switch ((Get-Date 1-Jan-2022), (Get-Date 25-Dec-2021)) {
{ $_.Year -eq 2021 }
{
$days = ((Get-Date 1/1/2022) - $_).Days
"There are $days days until 2022."
}
{ $_.Year -eq 2022 } { 'Welcome to 2022!' }
}
Если значение соответствует нескольким условиям, выполняется действие для каждого условия. Чтобы изменить это поведение, используйте break
ключевые слова или continue
ключевые слова.
Ключевое break
слово останавливает обработку и завершает инструкцию switch
.
Ключевое continue
слово перестает обрабатывать текущее значение, но продолжает обрабатывать все последующие значения.
В следующем примере выполняется обработка массива чисел и отображение, если они нечетные или даже. Отрицательные числа пропускаются с ключевым словом continue
. Если обнаружено не число, выполнение завершается с помощью ключевого break
слова.
switch (1,4,-1,3,"Hello",2,1) {
{$_ -lt 0} { continue }
{$_ -isnot [int32]} { break }
{$_ % 2} { "$_ is Odd" }
{-not ($_ % 2)} { "$_ is Even" }
}
1 is Odd
4 is Even
3 is Odd
Примеры параметров файла
Использование инструкции switch
с параметром файла является эффективным способом обработки больших файлов по строкам. PowerShell передает строки файла в инструкцию switch
. Каждая строка обрабатывается по отдельности.
Вы можете завершить обработку перед достижением конца файла с помощью ключевого слова break
в инструкции действия. Оператор switch
эффективнее, чем использование Get-Content
для обработки больших файлов по строкам.
Вы можете объединить switch -File
с -Wildcard
или -Regex
для гибкого и эффективного сопоставления шаблонов по строкам.
В следующем примере считывается README.md
в репозитории PowerShell-Docs.
Он выводит каждую строку, пока не достигнет строки, начинающейся с ##
.
switch -Regex -File .\README.md {
'^##\s' { break }
default { $_; continue }
}
Аргумент <filename>
интерпретируется как подстановочное выражение, но он должен соответствовать только одному файлу. Следующий пример совпадает с предыдущим, за исключением того, что он использует подстановочный знак в аргументе <filename>
. Этот пример работает, так как шаблон подстановочного знака соответствует только одному файлу.
switch -Regex -File .\README.* {
'^##\s' { break }
default { $_; continue }
}
Вы должны экранировать символы, которые можно интерпретировать как подстановочные знаки, если они будут рассматриваться как литералы.
$file = (New-Item -Path 'Temp:\Foo[0]' -Value Foo -Force).FullName
switch -File $file { Foo { 'Foo' } }
# No files matching '...\Temp\Foo[0]' were found.
$fileEscaped = [WildcardPattern]::Escape($file)
switch -File $fileEscaped { foo { 'Foo' } }
# Foo
См. также
PowerShell