繁体   English   中英

仅PowerShell单开关参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM