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

时间:2018-09-20 05:45:45

标签: c# powershell cmdlets

我在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

1 个答案:

答案 0 :(得分:0)

PowerShell将根据给定的命令尝试解析ParameterSet,并且除非存在无法用当前输入解析的默认值,否则不会尝试解析非默认ParameterSet。在您的方案中,默认情况下ParameterSet'two'是默认值,而ParameterA是该ParameterSet的一部分,因此从逻辑上讲,PowerShell假设您要定位的对象是输入,因为该输入仍然有效。如果您希望自己提供参数A,则需要创建一个仅包含参数A的ParameterSet,并且它必须是默认值(示例中的ParameterSet为“ one”)。

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

PowerShell也不区分大小写,因此您无需使用小写字母等效的参数来别名化参数(如果这是一种代表性的情况)