Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Краткое описание
Описывает использование коммутатора для обработки нескольких условных инструкций.
Длинное описание
Чтобы проверить условие в скрипте или функции, можно использовать инструкцию if .
Оператор if может проверять множество типов условий, включая значение переменных и свойства объектов.
Чтобы проверить несколько условий, можно использовать инструкцию switch . Инструкция switch похожа на ряд инструкций if , но это проще. Инструкция switch перечисляет каждое условие и соответствующее действие. Если условие соответствует, выполняется действие.
Это важно
Оператор switch преобразует все значения в строки перед сравнением.
Синтаксис
Базовый оператор switch имеет следующий формат:
switch (<test-expression>) {
<result1-to-be-matched> {<action-statement>}
<result2-to-be-matched> {<action-statement>}
}
Синтаксис инструкции switch аналогичен следующим if операторам:
if ("$(<result1-to-be-matched>)") -eq ("$(<test-expression>)") {<action>}
if ("$(<result2-to-be-matched>)") -eq ("$(<test-expression>)") {<action>}
Выражения включают литеральные значения (строки или числа), переменные и блоки скриптов, возвращающие логическое значение. Оператор switch преобразует все значения в строки перед сравнением. Пример см. в разделе "Влияние преобразования строк " далее в этой статье.
Вычисляется <test-expression> в режиме выражения. Если выражение возвращает несколько значений, таких как массив или другой перечисляемый тип, switch инструкция вычисляет каждое перечисленное значение отдельно.
Выражение <result-to-be-matched> должно разрешаться в одно значение.
Это значение сравнивается с входным значением.
Значение default зарезервировано для действия, используемого при отсутствии других совпадений.
Оператор switch может использовать $_ и $switch автоматические переменные. Автоматическая переменная содержит значение выражения, переданного switch инструкции, и доступно для оценки и использования в пределах области инструкций <result-to-be-matched> . Дополнительные сведения см. в about_Automatic_Variables.
Полный синтаксис инструкции switch выглядит следующим образом:
switch [-Regex | -Wildcard | -Exact] [-CaseSensitive] (<test-expression>) {
string | number | variable | { <value-scriptblock> }
{ <action-statement> }
default { <action-statement> } # optional
}
или
switch [-Regex | -Wildcard | -Exact] [-CaseSensitive] -File filename {
string | number | variable | { <value-scriptblock> }
{ <action-statement> }
default { <action-statement> } # optional
}
Если параметры не используются, switch ведет себя так же, как и с помощью параметра Exact. Он выполняет нечувствительное совпадение регистра для значения. Если значение является коллекцией, каждый элемент вычисляется в том порядке, в котором он отображается.
Оператор switch должен содержать по крайней мере одну инструкцию условия.
Предложение default активируется, если значение не соответствует ни одному из условий. Это эквивалентно предложению else в инструкции if. В каждой инструкции default разрешено только одно предложение switch.
switch имеет следующие параметры:
- подстановочный знак — указывает, что условие является строкой подстановочного знака. Если предложение match не является строкой, параметр игнорируется. Сравнение не учитывает регистр.
- Точное — указывает, что предложение соответствия, если это строка, должно соответствовать точно. Если предложение match не является строкой, этот параметр игнорируется. Сравнение не учитывает регистр.
- CaseSensitive — выполняет сопоставление с учетом регистра. Если предложение match не является строкой, этот параметр игнорируется.
-
файл — принимает входные данные из файла, а не
<test-expression>. Файл считывается по строке за раз и оценивается операторомswitch. По умолчанию сравнение не учитывает регистр. Параметр файла поддерживает только один файл. Если включены несколько параметров файла, используется только последний. Дополнительные сведения см. в примерах параметров файла. -
regex — выполняет сопоставление регулярного выражения значения с условием. Если предложение match не является строкой, этот параметр игнорируется.
Сравнение не учитывает регистр.
$Matchesавтоматическая переменная доступна для использования в блоке инструкций сопоставления.
Заметка
При указании конфликтующих значений, таких как Regex и подстановочные знаки, последний указанный параметр имеет приоритет и все конфликтующие параметры игнорируются. Также разрешено несколько экземпляров параметров. Однако используется только последний указанный параметр.
Примеры
В следующих примерах показано использование инструкции switch .
Простые примеры сопоставления
В следующем примере оператор 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.
Использование break и continue управление потоком
Если значение соответствует нескольким условиям, выполняется действие для каждого условия. Чтобы изменить это поведение, используйте ключевые слова 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 ( ([datetime]'1 Jan 1970').DayOfWeek ) {
4 { 'The integer value matches a Thursday.' }
"4" { 'The numeric string matches a Thursday.' }
"Thursday" { 'The string value matches a Thursday.' }
{ 4 -eq $_ } { 'The expression matches a Thursday.' }
}
Свойство DayOfWeek объекта date является перечислением. Хотя перечисления можно сравнить с числовыми или строковыми значениями, switch инструкция преобразует значение в строковое представление перечисления.
The string value matches a Thursday.
The expression matches a Thursday.
Это поведение отличается от поведения -eq сравнения в операторе if .
if (4 -eq ([datetime]'1 Jan 1970').DayOfWeek) {
'The integer value matches a Thursday.'
}
The value matches a Thursday.
В этом примере хэш-файл передается инструкции switch . Хэш-файл switch преобразуется в строку.
$test = @{
Test = 'test'
Test2 = 'test2'
}
$test.ToString()
System.Collections.Hashtable
Обратите внимание, что строковое представление хэш-файла не совпадает со значением ключа test .
switch -Exact ($test) {
'System.Collections.Hashtable' { 'Hashtable string coercion' }
'test' { 'Hashtable value' }
}
Hashtable string coercion
Использование switch для проверки значений в хэш-таблицы
В этом примере оператор 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 ("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.
Использование регулярных выражений с switch
В следующем примере используется параметр -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> сравнивает свойство года каждой даты. В <action-statement> отображается приветственное сообщение или количество дней до начала 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!' }
}
Чтение содержимого файла с помощью switch
Использование инструкции 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