Подтвердить что ты не робот

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

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

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

Поддерживает ввод y | ye | yes и нечувствительный к регистру.

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

Ответ 5

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 не может воспользоваться.

Ответ 6

Небольшая модификация сообщения derekerdmann для удовлетворения первоначального запроса с использованием оператора чередования регулярных выражений "|" (труба).

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

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

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

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." } 
}

Ответ 7

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

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