在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");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top