【发布时间】: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