Я в основном хочу это сделать:
switch($someString.ToLower())
{
"y", "yes" { "You entered Yes." }
default { "You entered No." }
}
Я в основном хочу это сделать:
switch($someString.ToLower())
{
"y", "yes" { "You entered Yes." }
default { "You entered No." }
}
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()". Если вы хотите, чтобы он был чувствительным к регистру, вы можете вместо этого использовать "-cconstains".
Вы можете использовать подстановочный знак для своих значений:
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 для удовлетворения первоначального запроса с использованием оператора чередования регулярных выражений "|" (труба).
Это также немного легче для новичков регулярных выражений, чтобы понять и прочитать.
Обратите внимание, что при использовании регулярного выражения, если вы не ставите символ строки "^" (каретки/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." }
}
После поиска решения для той же проблемы, как вы, я нашел здесь эту небольшую тему. Заранее я получил гораздо более плавное решение для этого переключателя, case case
switch($someString) #switch is caseINsensitive, so you don't need to lower
{
{ 'y' -or 'yes' } { "You entered Yes." }
default { "You entered No." }
}