PowerShell似乎无法处理命令中大量的参数集。

4

一个cmdlet可以有多少个参数集限制吗?我创建了一个包含56个开关参数的cmdlet,我希望每个参数集中的每个参数都是必需的。但是由于某种原因,PowerShell将(n+1)th与第1个分组,(n+2)th与第2个分组等,最终只有不超过n个参数集;如果我数对了,n是32。 这是我的cmdlet的样子:

[Cmdlet(VerbsCommon.Get, "Foo")]
public class GetFoo : PSCmdlet
{
    [Parameter(ValueFromPipeline = true)]
    public string ParamA {get;set;}

    [Parameter(ValueFromPipelineByPropertyName = true)]
    public string ParamB {get;set;}

    [Parameter]
    public string ParamC {get;set;}

    [Parameter(ParameterSetName = "Group1", Mandatory = true)]
    public SwitchParameter Param1 {get;set;}

    [Parameter(ParameterSetName = "Group2", Mandatory = true)]
    public SwitchParameter Param2 {get;set;}
    . . .

    [Parameter(ParameterSetName = "Group56", Mandatory = true)]
    public SwitchParameter Param56 {get;set;}
}

期望结果:

PS> Get-Help Get-Foo
  Get-Foo -Param1 [-ParamA <string>] [-ParamB <string>] [-ParamC <string>]
  Get-Foo -Param2 [-ParamA <string>] [-ParamB <string>] [-ParamC <string>]
  . . .
  Get-Foo -Param56 [-ParamA <string>] [-ParamB <string>] [-ParamC <string>]

实际:

PS> Get-Help Get-Foo
  Get-Foo -Param1 -Param33 [-ParamA <string>] [-ParamB <string>] [-ParamC <string>]
  Get-Foo -Param2 -Param34 [-ParamA <string>] [-ParamB <string>] [-ParamC <string>]
  . . .
  Get-Foo -Param24 -Param56 [-ParamA <string>] [-ParamB <string>] [-ParamC <string>]
  Get-Foo -Param25 [-ParamA <string>] [-ParamB <string>] [-ParamC <string>]
  . . .
  Get-Foo -Param32 [-ParamA <string>] [-ParamB <string>] [-ParamC <string>]

我正在煞费苦心,但仍然无法找出我构建的cmdlet有什么问题。如果我减少参数集的数量,我就不会看到这种行为。希望能够得到一些提示。


这可能是Get-Help的限制吗?你能不能创建一个C#类ParameterGrouping,其中包含公共的SwitchParameter Param1 {get;set;}…Param9,然后在Cmdlet中使用一些ParameterGrouping参数来绕过这个限制呢? - What Would Be Cool
感谢您的回复。这不仅是一个Get-Help问题,即使我尝试使用cmdlet,例如Get-Foo -Param24,它也会抱怨-Param56未设置。ParameterGrouping是一个有趣的建议,但如果参数彼此没有逻辑连接,它并不特别有效-也许将其分解为不同的cmdlet会更合适... - DeZot
1
脚本绑定的高级函数也存在相同的限制。似乎在PowerShell中某处定义了限制。 - Adam Driscoll
1个回答

2

似乎每个 cmdlet 有 32 个参数集的限制。可以试试创建 65 个参数集并查看 -Param65 是否在集合 1 中(与 -Param1 和 -Param33 一起)。请注意保留 html 标签。

一个解决方法是将您的 SwitchParameters 更改为一个参数,该参数接受包含所有开关值的枚举。

Get-Foo -ParamD <EnumParams1To56> [-ParamA <string>] [-ParamB <string>] [-ParamC <string>]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接