我在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,它是默认参数集的一部分。
答案 0 :(得分:0)
PowerShell将根据给定的命令尝试解析ParameterSet,并且除非存在无法用当前输入解析的默认值,否则不会尝试解析非默认ParameterSet。在您的方案中,默认情况下ParameterSet'two'是默认值,而ParameterA是该ParameterSet的一部分,因此从逻辑上讲,PowerShell假设您要定位的对象是输入,因为该输入仍然有效。如果您希望自己提供参数A,则需要创建一个仅包含参数A的ParameterSet,并且它必须是默认值(示例中的ParameterSet为“ one”)。
E和F没有定义其ParameterSet属性,因此默认情况下,它们的ParameterSet设置为ParameterSet.AllParameterSets
,因此再次包含这两个字段对默认设置有效,因此PowerShell仍假定您就是试图做。
PowerShell也不区分大小写,因此您无需使用小写字母等效的参数来别名化参数(如果这是一种代表性的情况)