switch语句中多个值的powershell语法是什么?

我基本上想这样做:

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”运算符执行不区分大小写的search,所以不需要使用“ToLower()”。 如果您希望区分大小写,则可以使用“-ccontains”。

你应该可以使用通配符来表示你的值:

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

正则expression式也是允许的。

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

Powershell Switch文档: http : //technet.microsoft.com/en-us/library/ff730937.aspx

支持inputy | ye |是和不区分大小写。

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

只要目标案例位于案例之下/之后 ,或者分别重新分配$ _variables,您可以任意分支,级联和合并案件。


nb就像这种行为一样可爱,似乎揭示了PowerShell解释器并没有像所希望或假设的那样有效地实现开关/shell。 首先,使用ISEdebugging器进行debugging,表明不是优化查找,散列或二进制分支,而是依次testing每个案例,就像if-else语句那么多。 (如果是这样,请考虑先将最常见的案例放在第一位。)另外,如本答案所示,PowerShell在满足testing案例后继续进行testing。 而且残酷的是,甚至恰好是.NET CIL中的一个特殊优化的“开关”操作码,由于这种行为,PowerShell无法利用。

使用正则expression式的交替操作符“|”(pipe道)对derekerdmann的post进行轻微修改以满足原始请求。

正则expression式新手理解和阅读也稍微容易些。

请注意,虽然使用正则expression式,如果你不把string字符“^”(caret / circumflex)和/或string字符“$”(美元)的结束的开始,那么你可能会得到意想不到的/不直观的行为(如匹配“昨天“或”为什么“)。

在选项周围放置分组字符“()”(括号)可以减less每个选项的string开始和结束的必要性。 如果没有他们,你会得到意想不到的行为,如果你不正确的正则expression式。 当然,如果你不处理用户input,而是处理一些已知的string,那么不用分组和开始和结束string就可以读取更多的信息。

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

在像你这样的问题search解决scheme后,我发现这个小题目在这里。 事前我得到了一个更顺利的解决scheme,这个开关,案例陈述

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