Поделиться через


about_Switch

Краткое описание

Объясняет, как использовать переключатель для обработки нескольких 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
}

или

switch [-regex | -wildcard | -exact] [-casesensitive] -file filename
{
    "string" | number | variable | { <value-scriptblock> } { <action-scriptblock> }
    default { <action-scriptblock> }  # optional
}

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

Оператор switch должен включать по крайней мере один оператор условия.

Предложение default активируется, если значение не соответствует ни одному из условий. Он эквивалентен предложению else в операторе if . В каждой switch инструкции допускается только одно default предложение.

switch имеет следующие параметры:

  • Подстановочный знак — указывает, что условие является строкой с подстановочными знаками. Если предложение match не является строкой, параметр игнорируется. При сравнении регистр не учитывается.
  • Exact — указывает, что предложение match, если это строка, должно точно совпадать. Если предложение match не является строкой, этот параметр игнорируется. При сравнении регистр не учитывается.
  • CaseSensitive — выполняет сопоставление с учетом регистра. Если предложение match не является строкой, этот параметр игнорируется.
  • File — принимает входные данные из файла, а не <test-expression>из . Если включено несколько параметров File, используется только последний из них. Каждая строка файла считывается и вычисляется оператором switch . При сравнении регистр не учитывается.
  • Регулярное выражение — выполняет сопоставление регулярного выражения значения с условием. Если предложение match не является строкой, этот параметр игнорируется. При сравнении регистр не учитывается. Автоматическая $matches переменная доступна для использования в блоке соответствующей инструкции.

Примечание

При указании конфликтующих значений, таких как регулярное выражение и подстановочный знак, последний указанный параметр имеет приоритет, а все конфликтующие параметры игнорируются. Также разрешено использовать несколько экземпляров параметров. Однако используется только последний указанный параметр.

Примеры

В следующем примере switch инструкция сравнивает тестовое значение 3 с каждым из условий. Когда тестовое значение соответствует условию, выполняется действие .

switch (3)
{
    1 {"It is one."}
    2 {"It is two."}
    3 {"It is three."}
    4 {"It is four."}
}
It is three.

В этом простом примере значение сравнивается с каждым условием в списке, даже если для значения 3 имеется совпадение. switch Следующая инструкция имеет два условия для значения 3. В нем показано, что по умолчанию проверяются все условия.

switch (3)
{
    1 {"It is one."}
    2 {"It is two."}
    3 {"It is three."}
    4 {"It is four."}
    3 {"Three again."}
}
It is three.
Three again.

Чтобы остановить switch сравнение после совпадения, используйте break оператор . Оператор break завершает инструкцию switch .

switch (3)
{
    1 {"It is one."}
    2 {"It is two."}
    3 {"It is three."; Break}
    4 {"It is four."}
    3 {"Three again."}
}
It is three.

Если тестовое значение является коллекцией, например массивом, каждый элемент в коллекции вычисляется в том порядке, в котором он отображается. В следующих примерах вычисляется значение 4, а затем 2.

switch (4, 2)
{
    1 {"It is one." }
    2 {"It is two." }
    3 {"It is three." }
    4 {"It is four." }
    3 {"Three again."}
}
It is four.
It is two.

Все break инструкции применяются к коллекции, а не к каждому значению, как показано в следующем примере. Оператор switch завершается оператором break в условии значения 4.

switch (4, 2)
{
    1 {"It is one."; Break}
    2 {"It is two." ; Break }
    3 {"It is three." ; Break }
    4 {"It is four." ; Break }
    3 {"Three again."}
}
It is 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 is one."; Break}
    2 {"It is two."; Break}
    3 {"It is three."; Break}
    4 {"It is four."; Break}
    "fo*" {"That's too many."}
}

Добавив default предложение , можно выполнить действие, если другие условия не будут выполнены.

switch ("fourteen")
{
    1 {"It is one."; Break}
    2 {"It is two."; Break}
    3 {"It is three."; Break}
    4 {"It is four."; Break}
    "fo*" {"That's too many."}
    Default {
        "No matches"
    }
}
No matches

Чтобы слово "четырнадцать" соответствовало регистру -Wildcard , необходимо использовать параметр или -Regex .

   PS> switch -Wildcard ("fourteen")
       {
           1 {"It is one."; Break}
           2 {"It is two."; Break}
           3 {"It is three."; Break}
           4 {"It is 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

См. также раздел