Каков синтаксис powershell для нескольких значений в инструкции switch?
Я в основном хочу сделать это:
switch($someString.ToLower())
{
"y", "yes" { "You entered Yes." }
default { "You entered No." }
}
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." } }