多个参数集不起作用

时间:2016-01-29 19:47:01

标签: powershell named-parameters

我试图使用参数集编写一个失败的简单脚本来简化输入和验证。我希望脚本看起来像这样:

.\zipandrotate.ps1 -Zip [-AllButDays <int>] -Rotate [-MaxRetentionDays <int>]

-Zip因此-AllButDays是可选的-Rotate-MaxRetentionDays

我已尝试将默认参数设置为zip,但这不起作用。我希望它允许执行:只需拉链,只需旋转或同时拉链和旋转。

[CmdletBinding(DefaultParameterSetBame="zip")]
param(
    [Parameter(Mandatory=$false, ParameterSetName="zip")]
    [Switch]$Zip,

    [Parameter(Mandatory=$true, ParameterSetName="rotate")]
    [Switch]$Rotate,

    [Parameter(ParameterSetName="zip", Mandatory=$true)]
    [int]$AllButDays,

    [Parameter(ParameterSetName="rotate", Mandatory=$false)]
    [int]$MaxRetentionDays
)

我在PowerShell 5(Windows 10)和PowerShell 4(Windows 7)中收到以下错误:

PS C:\> .\zipandrotate.ps1 -Zip -AllButDays 2 -Rotate -MaxRetentionDays 2
C:\zipandrotate.ps1 : Parameter set cannot be resolved using the specified named
parameters.
At line:1 char:1
+ .\zipandrotate.ps1 -Zip -AllButDays 2 -Rotate -MaxRetentionDays 2
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [zipandrotate.ps1], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,zipandrotate.ps1

以三种不同的方式运行命令告诉我问题在于尝试同时使用-Zip-Rotate

使用:

.\zipandrotate.ps1 -zip -allbutdays 2
.\zipandrotate.ps1 -rotate -maxretentiondays 90

不能工作:

.\zipandrotate.ps1 -zip -allbutdays 2 -rotate -maxretentiondays 90

所以我看到我的剧本有4条路径:

允许:只是拉链,只是旋转,两个
不允许:无

关于我如何到达那里的任何建议?添加第三个参数集可以逆转这种情况。只有-Zip-Rotate有效;个人使用不再有任何独特的案例来确定他们是哪个参数集。有没有办法获得我想要的功能,无需额外的参数来单独运行-Zip-Rotate

1 个答案:

答案 0 :(得分:1)

我不认为使用静态参数集可以实现您所要求的内容。您将不得不在函数内使用dynamic parameters或其他验证码。

但是,我不认为我首先会像您一样参数化脚本。您的参数由两个开关组成,每个开关与一个参数相关联。这意味着您可以完全放下开关并只使用参数。既然你似乎想要实现日志轮换或某些事情,我可能会将这两个参数作为可选参数并给出它们合理的默认值,例如:像这样:

[CmdletBinding()]
param(
    [Parameter(Mandatory=$false)]
    [ValidateRange(1,120)]
    [int]$MaxRetention = 30,  # days

    [Parameter(Mandatory=$false)]
    [ValidateRange(1,30)]
    [int]$CompressAfter = 2   # days
)