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