【问题标题】:Powershell does not seem to cope with a big number of parameter sets in a cmdletPowershell 似乎无法处理 cmdlet 中的大量参数集
【发布时间】:2013-01-19 02:04:36
【问题描述】:

对 cmdlet 可以拥有的参数集数量是否有任何限制?我已经制作了一个 cmdlet,它有 56 个开关参数,我希望每个参数在自己的参数集中都是强制性的。出于某种原因,powershell 将第 (n+1) 个与第一个分组,将第 (n+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 public SwitchParameter Param1 {get;set;} ... Param 9 然后在你的 Cmdlet 中使用一些 ParameterGrouping 参数来克服限制吗?
  • 感谢您的回复。这不仅仅是一个 Get-Help 问题,即使我尝试使用 cmdlet,例如Get-Foo -Param24,它抱怨 -Param56 没有设置。 ParameterGrouping 是一个有趣的建议,但如果参数之间没有逻辑连接,它就不会特别好用——也许将它分解为不同的 cmdlet 会更合适......
  • 具有 cmdlet 绑定的基于脚本的高级功能也存在同样的限制。似乎在 PowerShell 中的某些地方定义了一个限制。

标签: powershell


【解决方案1】:

每个 cmdlet 似乎有 32 个 ParameterSet 的限制。看看你是否可以通过创建 65 个参数集来测试它,看看 -Param65 是否在集合 1 中(使用 -Param1 和 -Param33)。

一种解决方法是将您的 SwitchParameters 更改为一个参数,该参数采用包含所有开关值的 Enum。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-27
    • 2011-05-23
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 2017-09-10
    • 2014-08-06
    • 2019-02-24
    相关资源
    最近更新 更多