我基本上想要这样做:
switch($someString.ToLower())
{
"y", "yes" { "You entered Yes." }
default { "You entered No." }
}
答案 0 :(得分:74)
switch($someString.ToLower())
{
{($_ -eq "y") -or ($_ -eq "yes")} { "You entered Yes." }
default { "You entered No." }
}
答案 1 :(得分:41)
您应该可以为您的值使用通配符:
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切换文档: Using the Switch Statement
答案 2 :(得分:41)
我发现这有效并且看起来更具可读性:
switch($someString)
{
{ @("y", "yes") -contains $_ } { "You entered Yes." }
default { "You entered No." }
}
“-contains”运算符执行非区分大小写的搜索,因此您不需要使用“ToLower()”。如果您确实希望它区分大小写,则可以改为使用“-ccontains”。
答案 3 :(得分:4)
支持输入y | ye | yes和不区分大小写。
switch -regex ($someString.ToLower()) {
"^y(es?)?$" {
"You entered Yes."
}
default { "You entered No." }
}
答案 4 :(得分:4)
switch($someString.ToLower())
{
"yes" { $_ = "y" }
"y" { "You entered Yes." }
default { "You entered No." }
}
您可以以这种方式任意分支,级联和合并案例,只要目标案例位于下面/之后案例或分别重新分配$ _变量的情况。
n.b。尽管这种行为很可爱,但它似乎表明PowerShell解释器没有像人们希望或假设的那样高效地实现switch / case。首先,使用ISE调试器的步骤表明,不是优化查找,散列或二进制分支,而是依次测试每个案例,就像许多if-else语句一样。 (如果是这样,请考虑先将最常见的案例放在首位。)另外,如本答案所示,PowerShell在满足后继续测试案例。而且还很残忍,甚至在.NET CIL中也有一个特殊优化的“switch”操作码,由于这种行为,PowerShell无法利用。
答案 5 :(得分:3)
使用正则表达式的交替运算符“|”(管道)对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." }
}
答案 6 :(得分:1)
在PowerShell 5.1中,该开关似乎不区分大小写。以下所有$someString
示例都可以使用。
$someString = "YES"
$someString = "yes"
$someString = "yEs"
$someString = "y"
switch ($someString) {
{"y","yes"} { "You entered Yes." }
Default { "You didn't enter Yes."}
}
这是我的$PSVersionTable
数据。
Name Value
---- -----
PSVersion 5.1.17763.771
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17763.771
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
答案 7 :(得分:0)
这是另一个。无论如何,开关不区分大小写。 -eq 左边的数组将返回它等于的东西,返回的任何东西都是真的。
switch($someString)
{
{ 'y', 'yes' -eq $_ } { 'You entered Yes.' }
default { 'You entered No.' }
}
答案 8 :(得分:-3)
在搜索与您相同的问题的解决方案后,我在这里找到了这个小主题。事先我为这个开关,案例陈述提供了更顺畅的解决方案
switch($someString) #switch is caseINsensitive, so you don't need to lower
{
{ 'y' -or 'yes' } { "You entered Yes." }
default { "You entered No." }
}