在PowerShell 1.0中,如果我有一个枚举类型的cmdlet参数,那么测试用户是否在cmdlet命令行上指定该参数的建议方法是什么?例如:
MyEnum : int { No = 0, Yes = 1, MaybeSo = 2 }
class DoSomethingCommand : PSCmdlet
...
private MyEnum isEnabled;
[Parameter(Mandatory = false)]
public MyEnum IsEnabled
{
get { return isEnabled; }
set { isEnabled = value; }
}
protected override void ProcessRecord()
{
// How do I know if the user passed -IsEnabled <value> to the cmdlet?
}
有没有办法做到这一点,而不必使用虚拟值种子isEnabled?默认情况下,它将等于0,我不希望为每个参数设置种子或为我的枚举添加虚拟值。我可能有100个参数的很多 cmdlet,必须有更好的方法。这与this question有关,但我一直在寻找一种更清洁的方法。 谢谢。
答案 0 :(得分:9)
在这种情况下,我会在枚举类型周围使用可空的包装器,例如:
[Parameter(Mandatory = false)]
public MyEnum? IsEnabled { get; set; }
注意? MyEnum上的修饰符。然后你可以测试它是否设置如下:
if (this.IsEnabled.HasValue) { ... }
答案 1 :(得分:4)
最终,这与PowerShell无关,而且与.NET的良好编码实践有关。
答案 2 :(得分:2)
作为一种选择,您可以使用$PSBoundParameters
集合来检查是否传递给该方法。
假设我们有一个像{ "p1": "value1", "p2": "value2" }
之后的json文件,我们想创建一个接受参数p1
和p2
并更新p1
和{{ 1}}(如果已将它们传递给函数)。假设这些值可以为p2
,并且将这些值设置为null并不等于不传递它们。
例如,null
应该将Update-Values -p1 $null
更新为p1
,而不应该更改null
。
为此,我们应该能够检测参数是否已传递给方法。
示例-如何为是否可以接受null作为值的可选参数检测是否传递了参数?
p2
然后,如果您使用以下参数运行该函数:
Function Update-Values ($p1, $p2) {
If($PSBoundParameters.ContainsKey("p1")) {
Write-Host "p1 passed"
}
else {
Write-Host "p1 not passed"
}
If($PSBoundParameters.ContainsKey("p2")) {
Write-Host "p2 passed"
}
else {
Write-Host "p2 not passed"
}
}
结果,您将看到:
Update-Values -p1 $null
# Update-Values -p1 "something"
您可以在此处阅读博客文章:How to determine if a parameter is passed to a Powershell Cmdlet。
答案 3 :(得分:1)
我唯一能看到的就是修改你的枚举,以便将值0命名为Unknown或类似名称。
问题是枚举只是背景中的整数而整数是值类型。不幸的后果是他们需要有值,默认值为0。
答案 4 :(得分:1)
我知道这个线程现在有点老了,但最好的方法是使用SwitchParameter类型声明你的参数。然后你的用户不必传递-IsEnabled,他们只需添加像-Enabled这样的参数。
然后,测试参数的.IsPresent属性,以查看调用者是否添加了-Enabled来调用cmdlet。
答案 5 :(得分:0)
bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled");