繁体   English   中英

powershell cmdlet 的枚举参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM