如何确定是否指定了PowerShell Cmdlet参数值?

时间:2009-07-29 23:57:24

标签: c# powershell parameters cmdlets

在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有关,但我一直在寻找一种更清洁的方法。 谢谢。

6 个答案:

答案 0 :(得分:9)

在这种情况下,我会在枚举类型周围使用可空的包装器,例如:

[Parameter(Mandatory = false)]
public MyEnum? IsEnabled { get; set; }

注意? MyEnum上的修饰符。然后你可以测试它是否设置如下:

if (this.IsEnabled.HasValue) { ... }

答案 1 :(得分:4)

除了PowerShell之外,以这种方式使用0永远不是好的风格。您应始终使用0作为最合适的默认值。在这种情况下,最合适的默认值应该是“Unset”。

最终,这与PowerShell无关,而且与.NET的良好编码实践有关。

  • [287]莪

答案 2 :(得分:2)

作为一种选择,您可以使用$PSBoundParameters集合来检查是否传递给该方法。

假设我们有一个像{ "p1": "value1", "p2": "value2" }之后的json文件,我们想创建一个接受参数p1p2并更新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");