具有相同参数子集的参数集的 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,它是默认参数集的一部分。
- 有人可以帮我理解这种行为吗?
- 如何使用参数集执行 cmdlet "one"
PowerShell 将根据给定的命令尝试解析 ParameterSet,并且不会尝试解析非默认的 ParameterSet,除非当前输入无法解析默认的 ParameterSet。在您的场景中,ParameterSet 'two' 是默认值,而 Parameter A 是该 ParameterSet 的一部分,因此从逻辑上讲,这就是 PowerShell 假设您的目标,因为输入对其仍然有效。如果您希望能够自己提供参数 A,则需要创建一个仅包含参数 A 的参数集,并且这必须是默认值(在您的示例中为参数集 'one')。
E 和 F 没有定义它们的 ParameterSet 属性,因此默认情况下它们的 ParameterSet 设置为 ParameterSet.AllParameterSets
,因此再次包含这两个字段对默认集有效,因此 PowerShell 仍然假定这就是您想要做的。
此外,PowerShell 不区分大小写,因此您无需使用等效的小写字母对参数进行别名(如果这是典型情况)
我在 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,它是默认参数集的一部分。
- 有人可以帮我理解这种行为吗?
- 如何使用参数集执行 cmdlet "one"
PowerShell 将根据给定的命令尝试解析 ParameterSet,并且不会尝试解析非默认的 ParameterSet,除非当前输入无法解析默认的 ParameterSet。在您的场景中,ParameterSet 'two' 是默认值,而 Parameter A 是该 ParameterSet 的一部分,因此从逻辑上讲,这就是 PowerShell 假设您的目标,因为输入对其仍然有效。如果您希望能够自己提供参数 A,则需要创建一个仅包含参数 A 的参数集,并且这必须是默认值(在您的示例中为参数集 'one')。
E 和 F 没有定义它们的 ParameterSet 属性,因此默认情况下它们的 ParameterSet 设置为 ParameterSet.AllParameterSets
,因此再次包含这两个字段对默认集有效,因此 PowerShell 仍然假定这就是您想要做的。
此外,PowerShell 不区分大小写,因此您无需使用等效的小写字母对参数进行别名(如果这是典型情况)