6

在 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,必须有更好的方法。这与这个问题有关,但我正在寻找一种更清洁的方法。谢谢。

4

6 回答 6

10

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

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

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

if (this.IsEnabled.HasValue) { ... }
于 2009-07-31T03:37:37.657 回答
4

抛开 PowerShell 不谈,以这种方式使用 0 绝不是一种好风格。您应该始终使用 0 作为最合适的默认值。在这种情况下,最合适的默认值应该是“未设置”。

归根结底,这与 PowerShell 无关,而是与 .NET 的良好编码实践有关。

  • 奥辛
于 2009-07-30T03:02:38.017 回答
3

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

假设我们有一个如下所示的 json 文件{ "p1": "value1", "p2": "value2" },并且我们想要创建一个函数,该函数接受参数p1p2更新文件中的p1p2的值,如果它们被传递给函数。假设这些值可以是null并且将这些值设置为 null 并不等于不传递它们。

例如Update-Values -p1 $null应该更新p1null不应该改变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

于 2018-12-27T03:52:46.123 回答
2

我知道这个线程现在有点老了,但最好的方法是使用 SwitchParameter 类型声明你的参数。然后您的用户不必传递 -IsEnabled ,他们只需添加 -Enabled 之类的参数作为参数。

然后测试参数的 .IsPresent 属性以查看调用者是否将 -Enabled 添加到对 cmdlet 的调用中。

于 2009-09-30T05:05:15.223 回答
1

我唯一能看到的是修改您的枚举,以便将值 0 命名为 Unknown 或类似的名称。

问题是枚举只是背景中的整数,而整数是值类型。不幸的结果是它们需要有值,而该值默认为 0。

于 2009-07-30T00:20:12.067 回答
0
bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled");
于 2014-08-15T15:13:07.940 回答