【问题标题】:Multiple Parameter Sets Not Working多个参数集不起作用
【发布时间】:2016-05-07 16:14:33
【问题描述】:

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

.\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 : 无法使用指定的命名解析参数集
参数。
在行:1 字符: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

【问题讨论】:

  • 如果这是唯一需要的值,你能把每组组合起来吗? -ZipAllButDays:2?

标签: powershell named-parameters


【解决方案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
)

【讨论】:

  • 感谢您的回答。我将深入研究动态参数,看看我是否可以在那里做我想做的事情。
猜你喜欢
  • 2013-12-02
  • 2022-07-28
  • 2012-05-05
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
相关资源
最近更新 更多