【问题标题】:Powershell C# cmdlet with parametersets with same subset of parameters具有相同参数子集的参数集的 Powershell C# cmdlet
【发布时间】:2019-02-24 08:46:12
【问题描述】:

我在 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 或 MyCustomCmdlet -A -E -F

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

  1. 谁能帮我理解这种行为?
  2. 如何使用参数集“one”执行 cmdlet

【问题讨论】:

    标签: c# powershell cmdlets


    【解决方案1】:

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

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

    此外,PowerShell 不区分大小写,因此您无需使用小写等效项(如果这是一个代表性场景)为您的参数设置别名

    【讨论】:

    • 非常感谢鱼!这很有帮助。我只是要删除参数集并在代码中进行验证。
    • 为什么不将默认设置为“一”? :) ParameterSets 与 Intellisense 配合得很好
    • 是的,最后确实将默认设置为'one's。
    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多