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

时间:2010-08-16 13:47:54

标签: powershell switch-statement

我基本上想要这样做:

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

9 个答案:

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