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)
与 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)
如果此脚本需要接受自定义枚举,则意味着您将从其他地方调用它,其中枚举定义已存在。现在您尝试在脚本中再次添加相同的定义。根据 @Alex_P 建议将其推送到模块中是个好主意,这样定义就位于一个位置,但缺点是Import-Module
不会#Requires
导入它,因此需要 forusing module
子句。
但是,如果您愿意接受更简单且安全性较低的解决方案,您可以利用您定义的任何枚举都派生自 System.Enum 的事实。[System.Enum]$Level
将仅接受所有枚举,如果不是 LevelEnum,脚本将中断,但它仍然会在脚本执行之前过滤大多数可能的错误,并提供有关参数类型的一些信息。
归档时间: |
|
查看次数: |
1221 次 |
最近记录: |