[英]powershell single switch parameter only
假设我有三个开关参数
param(
[parameter(Mandatory=$false] [switch] $i,
[parameter(Mandatory=$false] [switch] $ir,
[parameter(Mandatory=$false] [switch] $iur
)
其中只有一个是允许的,什么是做到这一点的最好方法是什么? 如果使用上面的方法,则可以在单个调用中将所有三个开关作为参数添加(不希望的)。
> invoke-aspnetregiis -i -ir -iur # bad
我最初在[string]
上使用ValidateSet
[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中是否有更好的方法可以做到这一点?
参数集通常是用于此类操作的参数。 如果您在参数之后命名参数集,甚至可以简化将参数传递给您正在调用的实际命令的方法:
[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>]
因此,这种替代方法对用户的友好程度有所降低。
最好的可以使用验证脚本
[Parameter(Mandatory=$false)][ValidateScript({-not ($descendente -or $aleatorio )})][Switch]$ascendente,
[Parameter(Mandatory=$false)][ValidateScript({-not ($ascendente -or $aleatorio )})][Switch]$descendente,
[Parameter(Mandatory=$false)][ValidateScript({-not ($ascendente -or $descendente)})][Switch]$aleatorio
所以powershell会抛出错误
关于ParameterSetName用法的任何事情都不会使开关无关紧要。 它们是用户首先选择模式的方式。
您不必为ParameterSetName使用与开关名称相同的名称。
您不必使用$argument
,也可以仅使用开关名称。
您可以只使用开关名称,而忽略ParameterSetName
(因为powershell确保已经在一组开关中只有一个开关)。
您还可以根据需要手动验证给定的参数。
我不知道其他任何方式(但我也不是Powershell专家)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.