仅限powershell单一开关参数

时间:2015-03-23 19:42:14

标签: powershell

提供我有三个开关参数

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中有更好的方法来实现这一目标吗?

3 个答案:

答案 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专家)。