[英]Enum parameter for powershell cmdlet
我正在 powershell 上编写一个 cmdlet(脚本),我想使用 eunm 作为参数之一。 但我不知道将枚举定义放在哪里,以便对 cmdlet 参数声明可见。
例如,我有一个像这样的脚本的参数定义
[cmdletbinding()]
param(
[Parameter(Mandatory=$True)]
[string]$Level
)
和这样的枚举
enum LevelEnum { NC = 1; NML = 2; CS = 3 }
我无法在参数定义中将[string]
替换为[LevelEnum]
,因为脚本将无法找到枚举定义。 而且我不能将定义放在cmdletbinding
之前,这是不允许的。 如果那将是 function,我知道该怎么做,我知道可以使用ValidateSet
解决,但我需要 integer 值对应于枚举选项。
[ValidateSet('NC','NML','CS')]
但问题是,我可以对 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__
与 PowerShell 语法的所有其他部分不同,类型定义(和using
语句)是在parse-time发出的,您可以通过将enum
定义放在脚本或依赖于它的 function 中来利用这一点(尽管它可能看起来违反直觉):
[cmdletbinding()]
param(
[Parameter(Mandatory=$True)]
[LevelEnum]$Level
)
begin {
enum LevelEnum { NC = 1; NML = 2; CS = 3 }
}
end {
# rest of your script goes here
}
我会尝试这样的事情:
下面我用LevelEnum
定义创建了一个普通的 PSM1 文件。
enum LevelEnum{
High
Medium
Low
}
之后,我将using module
与 PSM1 文件的路径一起使用。
using module C:\Users\Path\To\Module\testmodule.psm1
function Get-Verb {
[CmdletBinding()]
param (
[LevelEnum]$b
)
Write-Host $b
}
我使用了这个 microsoft 文档About_Using ,并且我还运行了 7.0.2 版。
如果此脚本需要接受自定义枚举,则意味着您将从其他地方调用它,其中枚举定义已经存在。 现在您正尝试在脚本中再次添加相同的定义。 根据@Alex_P 的建议将其推送到模块中是个好主意,因此定义位于一个位置,但缺点是Import-Module
或#Requires
不会导入它,因此需要using module
子句。
但是,如果您愿意接受更简单且安全性较低的解决方案,则可以利用您定义的任何枚举都派生自 System.Enum 的事实。 [System.Enum]$Level
将仅接受所有枚举,如果不是 LevelEnum,脚本将中断,但它仍会在脚本执行之前过滤大多数可能的错误并提供有关参数类型的一些信息。
[cmdletbinding()]
param(
[ArgumentCompleter({
enum LevelEnum { NC = 1; NML = 2; CS = 3 }
[LevelEnum].GetEnumValues()
})]
[ValidateScript({
enum LevelEnum { NC = 1; NML = 2; CS = 3 }
[LevelEnum]$_
})]
$Level
)
enum LevelEnum { NC = 1; NML = 2; CS = 3 }
[LevelEnum]$Level
这行得通,但我相信人们很容易忘记编辑所有枚举定义......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.