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

Mic*_*cah 67 powershell switch-statement

我基本上想要这样做:

switch($someString.ToLower())
{
    "y", "yes" { "You entered Yes." }
    default { "You entered No." }
}
Run Code Online (Sandbox Code Playgroud)

fle*_*her 79

switch($someString.ToLower()) 
{ 
    {($_ -eq "y") -or ($_ -eq "yes")} { "You entered Yes." } 
    default { "You entered No." } 
}
Run Code Online (Sandbox Code Playgroud)

  • 也可以做`{$ _ -in"y","yes"}`但是我不确定自哪个PS版本. (22认同)
  • 同样,你可以做 `{ "y", "yes" -contains $_ }` 这也是不区分大小写的,所以 'YES' 和 'yeS' 等等也可以。 (5认同)
  • -eq在执行字符串比较时不区分大小写,因此不需要ToLower (4认同)
  • @wannabeprogrammer [**In**运算符是在Windows PowerShell 3.0中引入的.](https://technet.microsoft.com/en-us/library/hh847759.aspx) (3认同)

小智 45

我发现这有效并且看起来更具可读性:

switch($someString)
{
    { @("y", "yes") -contains $_ } { "You entered Yes." }
    default { "You entered No." }
}
Run Code Online (Sandbox Code Playgroud)

"-contains"运算符执行非区分大小写的搜索,因此您不需要使用"ToLower()".如果您确实希望它区分大小写,则可以使用"-ccontains"代替.


der*_*ann 42

您应该能够为您的值使用通配符:

switch -wildcard ($someString.ToLower())
{
    "y*" { "You entered Yes." }
    default { "You entered No." }
}
Run Code Online (Sandbox Code Playgroud)

也允许使用正则表达式.

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

PowerShell交换机文档:使用Switch语句

  • 您实际上并不需要 `ToLower()`,因为在 PowerShell 中默认情况下字符串的相等性是不区分大小写的。 (3认同)
  • 很公平,虽然不同的正则表达式可能会做同样的事情. (2认同)
  • 正则表达式方法会更简洁. (2认同)

Gle*_*den 6

switch($someString.ToLower())
{
    "yes"   { $_ = "y" }
    "y"     { "You entered Yes." }
    default { "You entered No." }
}
Run Code Online (Sandbox Code Playgroud)

只要目标案例位于分别重新分配了$ _变量的案例的下方/之后,就可以以这种方式任意分支,级联和合并案例。


nb尽管这种行为很可爱,但似乎表明PowerShell解释器没有像人们希望或假定的那样有效地实现switch / case。首先,使用ISE调试器建议不要像优化查找,哈希或二进制分支那样,依次测试每种情况,就像许多if-else语句一样。(如果是这样,请考虑将最常见的案例放在首位。)此外,如该答案所示,PowerShell在满足案例后继续测试案例。而且非常残酷的是,.NET CIL中甚至恰好有一个经过特殊优化的“开关”操作码,由于这种行为,PowerShell无法利用它。

  • 它不可爱-有文件记录。如果您不希望评估后续分支,请添加break语句。 (2认同)
  • @Frank足够公平,“ Cute”可能不是最佳关键字,它指的是自“ C”(1975年)或更早版本以来在多种语言中相对于其历史语义已更改或不典型的关键字行为。 (2认同)

js2*_*010 6

这是另一张。无论如何,开关不区分大小写。-eq 左边有一个数组将返回它等于的东西,并且返回的任何东西都是 true。

switch($someString)
{
  { 'y', 'yes' -eq $_ } { 'You entered Yes.' }
  default               { 'You entered No.'  }
}
Run Code Online (Sandbox Code Playgroud)


Dou*_*nke 5

支持输入y | ye | yes,不区分大小写。

switch -regex ($someString.ToLower()) {
        "^y(es?)?$" {
            "You entered Yes." 
        }
        default { "You entered No." }
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,您的表达式“ [yes]”与$ someString中任意位置出现的字符“ y”,“ e”或“ s”匹配。即使$ someString是“ no!no!no!s”,该切换块也将返回“您输入了Yes”。由于末尾有“ s”。为了匹配y | ye | yes,表达式应为“ ^ y(es?)?$”。 (12认同)

小智 5

使用正则表达式的交替运算符“|”(管道)对 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." } 
}
Run Code Online (Sandbox Code Playgroud)