具有相同参数子集的参数集的 Powershell C# cmdlet

Powershell C# cmdlet with parametersets with same subset of parameters

我在 MyCustomCmdlet 中定义了以下参数集,默认参数集为两个:

    [Parameter(Mandatory = true, ParameterSetName = one)]
    [Parameter(Mandatory = true, ParameterSetName = two)]
    [Parameter(Mandatory = true, ParameterSetName = three)]
    [Parameter(Mandatory = true, ParameterSetName = four)]
    [ValidateNotNullOrEmpty]
    [Alias("a")]
    public string A { get; set; }

    [Parameter(Mandatory = true, ParameterSetName = two)]
    [ValidateNotNullOrEmpty]
    [Alias("b")]
    public string B { get; set; }

    [Parameter(Mandatory = true, ParameterSetName = three)]
    [SupportsWildcards]
    [ValidateNotNullOrEmpty]
    [Alias("c")]
    public string C { get; set; }


    [Parameter(Mandatory = true, ParameterSetName = four)]
    [ValidateNotNullOrEmpty]
    [Alias("d")]
    public string D { get; set; }


    [Parameter]
    [ValidateNotNullOrEmpty]       
    public string E{ get; set; }

    [Parameter]
    [ValidateNotNullOrEmpty]
    public string F { get; set; }

在调试期间,我得到了预期的参数集数量,即 4 个,参数如下:

1.ParameterSetName: 一个 参数: A , E, F

2.ParameterSetName: 两个参数:A, B, E, F

3.ParameterSetName: 三个参数:A, C, E, F

4.ParameterSetName: 四个参数:A, D, E, F

然而,当我执行时:

MyCustomCmdlet -A or MyCustomCmdlet -A -E -F

我收到错误说明,需要强制参数 B,它是默认参数集的一部分。

  1. 有人可以帮我理解这种行为吗?
  2. 如何使用参数集执行 cmdlet "one"

PowerShell 将根据给定的命令尝试解析 ParameterSet,并且不会尝试解析非默认的 ParameterSet,除非当前输入无法解析默认的 ParameterSet。在您的场景中,ParameterSet 'two' 是默认值,而 Parameter A 是该 ParameterSet 的一部分,因此从逻辑上讲,这就是 PowerShell 假设您的目标,因为输入对其仍然有效。如果您希望能够自己提供参数 A,则需要创建一个仅包含参数 A 的参数集,并且这必须是默认值(在您的示例中为参数集 'one')。

E 和 F 没有定义它们的 ParameterSet 属性,因此默认情况下它们的 ParameterSet 设置为 ParameterSet.AllParameterSets,因此再次包含这两个字段对默认集有效,因此 PowerShell 仍然假定这就是您想要做的。

此外,PowerShell 不区分大小写,因此您无需使用等效的小写字母对参数进行别名(如果这是典型情况)