多个参数集不起作用

Multiple Parameter Sets Not Working

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

.\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 条路径:

允许:仅压缩、仅旋转、两者
不允许:None

关于我如何到达那里有什么建议吗?添加第三个参数集扭转了局面。只有 -Zip-Rotate 有效;个人使用不再有任何独特的案例来确定它们是哪个参数集。有没有办法获得我想要消除对 运行 -Zip-Rotate 的额外参数的需要的功能?

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

但是,我认为我不会像您最初那样对脚本进行参数化。您的参数由两个开关组成,每个开关都与一个参数相关联。这意味着您可以完全放弃开关,只使用参数。由于您似乎想要实现日志轮换或类似的东西,我可能会将这两个参数都设为可选并为它们提供合理的默认值,例如像这样:

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

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