提供我有三个开关参数
param(
[parameter(Mandatory=$false] [switch] $i,
[parameter(Mandatory=$false] [switch] $ir,
[parameter(Mandatory=$false] [switch] $iur
)
并且只允许 ONE ,这是最好的方法吗?如果我使用上面的内容,可以在一次调用中将所有三个开关添加为参数(不合需要)。
> invoke-aspnetregiis -i -ir -iur # bad
我最初在ValidateSet
[string]
[parameter(Mandatory=$false, ValidateSet('-i', '-ir', '-iur'))] [string] $arg
然后电话看起来很有趣
invoke-aspnetregiis '-i' # notice the single quotes.
我更喜欢阅读
invoke-aspnetregiis -i # to mimic the native call
到目前为止,我提出的最好的方法是使用ParameterSetNames
[parameter(Mandatory=$false, ParameterSetName='i')] [switch] $i,
[parameter(Mandatory=$false, ParameterSetName='ir')] [switch] $ir,
[parameter(Mandatory=$false, ParameterSetName='iur')] [switch] $iur,
switch($PsCmdlet.ParameterSetName){
'i' {$argument = '-i'}
'ir' {$argument = '-ir'}
'iur' {$argument = '-iur'}
default {$argument = '-i'}
}
基本上使实际的开关无关紧要。
在Powershell中有更好的方法来实现这一目标吗?
答案 0 :(得分:2)
参数集是您通常用于此类的东西。如果在参数之后命名参数集,您甚至可以简化将参数传递给您正在调用的实际命令:
[CmdletBinding(DefaultParameterSetName='-i')]
Param(
[Parameter(ParameterSetName='-i',Mandatory=$false)][Switch]$i,
[Parameter(ParameterSetName='-ir',Mandatory=$false)][Switch]$ir,
[Parameter(ParameterSetName='-iur',Mandatory=$false)][Switch]$iur
)
& yourcommand $PSCmdlet.ParameterSetName
当然,还有其他选项,例如构建自己的逻辑以确保只提供三个参数中的一个:
Param(
[Parameter(Mandatory=$false)][Switch]$i,
[Parameter(Mandatory=$false)][Switch]$ir,
[Parameter(Mandatory=$false)][Switch]$iur
)
if (1 -ne $i.IsPresent + $ir.IsPresent + $iur.IsPresent) {
'Usage: script.ps1 {-i|-ir|iur}'
exit 1
}
然而,正如@mikez在评论中指出的那样,命令/脚本帮助不会自动显示参数不能相互结合使用:
PS C:\> .\test_paramset.ps1 -?
test_paramset.ps1 [-a] [<CommonParameters>]
test_paramset.ps1 [-b] [<CommonParameters>]
test_paramset.ps1 [-c] [<CommonParameters>]
PS C:\> .\test_no_paramset.ps1 -?
test_no_paramset.ps1 [-a] [-b] [-c] [<CommonParameters>]
因此使替代方法的用户友好性降低。
答案 1 :(得分:1)
最好使用验证笔迹
tlsCACerts
因此powershell会引发错误
答案 2 :(得分:0)
关于ParameterSetName用法的任何内容都使得交换机无关紧要。它们是用户首先选择模式的方式。
您不必使用ParameterSetName的相同名称作为交换机名称。
您不必使用$argument
,如果您不能使用,请使用切换名称。
您可以使用切换名称并忽略ParameterSetName
(因为powershell已经确保您只在这些集合中获得一个切换)。
如果您愿意,也可以手动验证给定的参数。
我不知道其他任何方式(但我也不是PowerShell专家)。