powershell cmdlet 的枚举参数

Mak*_*Sim 6 powershell cmdlets cmdlet

我正在 powershell 上编写一个 cmdlet(脚本),我想使用 eunm 作为参数之一。但我不知道将枚举定义放在哪里,以便它对 cmdlet 参数声明可见。

例如,我有一个像这样的脚本的参数定义

[cmdletbinding()]
param(
    [Parameter(Mandatory=$True)]
    [string]$Level
)
Run Code Online (Sandbox Code Playgroud)

和这样的枚举

enum LevelEnum { NC = 1; NML = 2; CS = 3 }
Run Code Online (Sandbox Code Playgroud)

我无法替换参数定义中的[string]with [LevelEnum],因为脚本将无法找到枚举定义。而且我之前不能放定义cmdletbinding,这是不允许的。如果那是一个函数,我知道该怎么做,我知道它可以使用 解决ValidateSet,但我需要有与枚举选项相关的整数值。

[ValidateSet('NC','NML','CS')]
Run Code Online (Sandbox Code Playgroud)

但问题是,我可以对 cmdlet 做同样的事情吗?


谢谢大家。我最终得到了不同答案的组合。

[cmdletbinding()]
param(
    [Parameter(Mandatory=$True)]
    [ValidateSet('NC','NML','CS')]
    [string]$Level
)
# Convert level from string to enum
enum PatchLevel { NC = 1; NML = 2; CS = 3 }
[PatchLevel]$l = $Level

# Use the numeric value
Write-Host $l.value__
Run Code Online (Sandbox Code Playgroud)

Mat*_*sen 5

与 PowerShell 语法的所有其他部分不同,类型定义(和using语句)在parse-time发出,您可以通过将enum定义放在依赖它的脚本或函数中来利用这一点(无论它看起来多么违反直觉):

[cmdletbinding()]
param(
    [Parameter(Mandatory=$True)]
    [LevelEnum]$Level
)

begin {
enum LevelEnum { NC = 1; NML = 2; CS = 3 }
}

end {
 # rest of your script goes here
}
Run Code Online (Sandbox Code Playgroud)

  • 我将其完全复制到文件 test.ps1 中,并尝试运行“.\test.ps1 NC”。我在 Powershell 5 和 7 中都收到“无法找到类型 [LevelEnum]。”。有什么我可能错过的吗?它仅适用于某些 Powershell 版本吗? (2认同)

Ada*_*ski 3

如果此脚本需要接受自定义枚举,则意味着您将从其他地方调用它,其中枚举定义已存在。现在您尝试在脚本中再次添加相同的定义。根据 @Alex_P 建议将其推送到模块中是个好主意,这样定义就位于一个位置,但缺点是Import-Module不会#Requires导入它,因此需要 forusing module子句。

但是,如果您愿意接受更简单且安全性较低的解决方案,您可以利用您定义的任何枚举都派生自 System.Enum 的事实。[System.Enum]$Level将仅接受所有枚举,如果不是 LevelEnum,脚本将中断,但它仍然会在脚本执行之前过滤大多数可能的错误,并提供有关参数类型的一些信息。

  • 感谢所有回复的人。虽然大多数赞成的答案在技术上是最正确的,但这个答案实际上让我得出结论:我的方法和我的问题是错误的。因此,我会将其标记为已接受。 (3认同)