在 switch 语句的 case 块中搜索多个枚举值的 PowerShell 语法?

问题描述 投票:0回答:2

我想做的事的例子:

    enum Fruit {
        Apple
        Banana
        Orange
    }

    $myFruit = [Fruit]::$UsrString

    switch ($myFruit) {
        Apple, Orange {
        Write-Host "This is an apple or an orange"
        break
        }
        Banana {
        Write-Host "This is a banana"
        break
        }
        default {
        Write-Host "Unknown fruit: $myFruit"
        break
        }
    }

但是我所做的每一次尝试都没有按预期工作,如果有的话.

我已经搜索过与 Powershellswitch-statementsenums 有关的任何内容,但尚未找到答案。

我在 StackOverflow 上查看了这个链接

只要我使用枚举项的整数值,我就成功使用了“switch -regEx (someEnum)”。然而,这基本上打败了枚举的使用(即标记为整数)。

我的意图 是让开关尽可能高效(即打开简单的 int 值;远离更常见的字符串比较样式 PS 开关使用,只是为了保持性能)。

在 powershell 中枚举使用是否存在多项 case 块语法?

提前感谢您提供任何信息。

powershell enums switch-statement
2个回答
1
投票

switch
声明:

  • 支持多个分支条件,但是...

  • 支持使用脚本块

    { ... }
    )作为分支条件,在其中您可以自由执行任何测试,包括多个值,使用automatic
    $_
    变量
    参考手头的输入值。

因此:

switch ($myFruit) {
  { $_ -in 'Apple', 'Orange' } {
    "This is an apple or an orange"
    break
  }
  Banana {
    "This is a banana"
    break
  }
  default {
    "Unknown fruit: $_"
  }
}

注:

  • 正如您在上面

    default
    分支的 action 脚本块中看到的那样,
    $_
    也引用那里的输入值。

    • 使用

      $_
      通常更可取,因为
      switch
      输入值可以是 array(类似列表的集合),在这种情况下,分支被评估 对于每个元素(然后
      $_
      指的是手头的元素。

    • 使用数组作为输入,在动作脚本块中使用

      continue
      代替
      break
      ,以便继续处理 下一个元素
      break
      将阻止处理更多元素)。

  • 请注意,即使将

    [Fruit]
    枚举值与 strings 进行比较,这种比较仍然有效,因为 PowerShell 可以方便地自动将枚举值与其字符串表示形式相互转换。


0
投票

为了让您的代码按预期工作,您需要在

switch
中使用脚本块条件,并在其第一个条件中使用 containment operator,例如:

$UsrString = 'Apple'

enum Fruit {
    Apple
    Banana
    Orange
}

$myFruit = [Fruit] $UsrString

switch ($myFruit) {
    { $_ -in 0, 2 } {
        Write-Host 'This is an apple or an orange'
        break
    }
    { $_ -eq 1 } {
        Write-Host 'This is a banana'
        break
    }
    # This condition could never be met,
    # because casting the enum to a value not present would throw
    default { 
        Write-Host "Unknown fruit: $_"
        break
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.