多个参数集不起作用
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
)
我正在尝试使用参数集编写一个简单的失败脚本来简化输入和验证。我希望脚本看起来像这样:
.\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
)