Каков синтаксис powershell для нескольких значений в инструкции switch?


Я в основном хочу сделать это:

switch($someString.ToLower())
{
    "y", "yes" { "You entered Yes." }
    default { "You entered No." }
}
7 56

7 ответов:

switch($someString.ToLower()) 
{ 
    {($_ -eq "y") -or ($_ -eq "yes")} { "You entered Yes." } 
    default { "You entered No." } 
}

Я знаю, что это старый поток, но я обнаружил, что это работает и кажется более читаемым:

switch($someString)
{
    { @("y", "yes") -contains $_ } { "You entered Yes." }
    default { "You entered No." }
}

оператор "-contains "выполняет поиск без учета регистра, поэтому вам не нужно использовать"ToLower ()". Если вы хотите, чтобы он был чувствителен к регистру, вы можете использовать "-ccontains" вместо этого.

вы должны иметь возможность использовать подстановочный знак для ваших значений:

switch -wildcard ($someString.ToLower()) 
{ 
    "y*" { "You entered Yes." } 
    default { "You entered No." } 
}

регулярные выражения также разрешены.

switch -regex ($someString.ToLower())
{
    "y(es)?" { "You entered Yes." }
    default { "You entered No." } 
}

документация по коммутатору Powershell:http://technet.microsoft.com/en-us/library/ff730937.aspx

поддерживает ввод y/ye / yes и без учета регистра.

switch -regex ($someString.ToLower()) {
        "^y(es?)?$" {
            "You entered Yes." 
        }
        default { "You entered No." }
}
switch($someString.ToLower())
{
    "yes"   { $_ = "y" }
    "y"     { "You entered Yes." }
    default { "You entered No." }
}

вы можете произвольно ветвить, каскадировать и объединять случаи таким образом, пока целевой случай находится ниже/после случай или случаи, когда переменная $_ соответственно переназначается.


n. b.Как мило, как это поведение, похоже, показывает, что интерпретатор PowerShell не реализует switch/case так эффективно, как можно было бы надеяться или предполагать. Во-первых, шаг с отладчиком ISE предполагает, что вместо оптимизированного поиска, хеширование, или двоичное ветвление, каждый случай проверяется по очереди, как и многие операторы if-else. (Если да, то сначала рассмотрите наиболее распространенные случаи.) Кроме того, как показано в этом ответе, PowerShell продолжает тестировать случаи после удовлетворения одного. И довольно жестоко, там даже есть специальный оптимизированный код операции "switch", доступный в .NET CIL, который из-за этого поведения PowerShell не может воспользоваться.

незначительное изменение после derekerdmann выполнить первоначальный запрос, используя оператор чередование регулярных выражений это "|"(труба).

это также немного легче для новичков регулярных выражений, чтобы понять и прочитать.

обратите внимание, что при использовании регулярного выражения, если вы не ставите начало строкового символа "^"(каретка/окружность) и/или конец строкового символа "$"(доллар), то вы можете получить неожиданное/неинтуитивное поведение (например, соответствие "вчера" или "почему").

поставив группировки символы "() " (круглые скобки) вокруг параметров уменьшает необходимость ставить начало и конец строковых символов для каждого параметра. Без них вы получите, возможно, неожиданное поведение, если вы не разбираетесь в регулярных выражениях. Конечно, если вы не обрабатываете пользовательский ввод, а скорее некоторый набор известных строк, он будет более читаемым без группировки и начала и конца строковых символов.

switch -regex ($someString) #many have noted ToLower() here is redundant
{
        #processing user input
    "^(y|yes|indubitably)$" { "You entered Yes." }

        # not processing user input
    "y|yes|indubitably" { "Yes was the selected string" } 
    default { "You entered No." } 
}

после поиска решения для той же проблемы, как вы, я нашел эту небольшую тему здесь. Заранее я получил гораздо более гладкое решение для этого переключателя, case statement

switch($someString) #switch is caseINsensitive, so you don't need to lower
{
    { 'y' -or 'yes' } { "You entered Yes." }
    default { "You entered No." }
}