我怎么确定如果一个PowerShell命参数值是指定?
-
05-07-2019 - |
题
在PowerShell1.0,如果我有命令的参数枚举的类型,有什么推荐的方法进行测试的用户是否指定参数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?
}
是否有任何方法来做到这一点,而不必种启用一个虚拟的价值?默认情况下,它将等于0,我不希望有种子的每一个参数或者添加一个虚拟值我的枚举。我可能有 很多 cmdlet与100的参数,还有以更好的方式。这是关系到 这个问题 但是我在寻找一个更清洁的方式这样做。谢谢。
解决方案
在这种情况下,我会在枚举类型周围使用可空的包装器,例如:
[Parameter(Mandatory = false)]
public MyEnum? IsEnabled { get; set; }
注意? MyEnum上的修饰符。然后你可以测试它是否设置如下:
if (this.IsEnabled.HasValue) { ... }
其他提示
PowerShell留,这是从来没有很好的风格使用0以这种方式。你应该始终使用0为最适当的默认。在这种情况下,最适当的默认应该是类似"取消。"
最终,这是什么做的with advanced和一切做好的编码做法。网。
- Oisin
作为一种选择,您可以使用 $ PSBoundParameters
集合检查是否传递给方法。
假设我们有一个json文件,如 {&quot; p1&quot;:&quot; value1&quot;,&quot; p2&quot;:&quot; value2&quot; }
我们要创建一个接受参数 p1
和 p2
的函数,并更新 p1
和 p2 <的值/ code>在文件中,如果它们被传递给函数。假设这些值可以是
null
,并且将这些值设置为null并不等同于不传递它们。
例如 Update-Values -p1 $ null
应将 p1
更新为 null
,不应更改 p2
为此,我们应该能够检测参数是否已传递给方法。
示例 - 如何检测是否传递参数,对于可以接受null作为值的可选参数?
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"
结果你会看到:
p1 passed
p2 not passed
你可以在这里阅读博客文章:如何确定参数是否传递给Powershell Cmdlet 。
我唯一能看到的就是修改你的枚举,以便将值0命名为Unknown或类似名称。
问题是枚举只是背景中的整数而整数是值类型。不幸的后果是他们需要有值,默认值为0。
我知道这个线程现在有点老了,但最好的方法是使用SwitchParameter类型声明你的参数。然后你的用户不必传递-IsEnabled,他们只需添加像-Enabled这样的参数。
然后,测试参数的.IsPresent属性,以查看调用者是否添加了-Enabled来调用cmdlet。
bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled");