多个powershell开关参数 - 可以优化吗?

时间:2014-02-03 13:01:53

标签: powershell parameters switch-statement

我正在尝试编写一个接受输出的一个参数的简单包装器。 这就是它现在的样子

function Get-data{
param (
    [switch]$network,
    [switch]$profile,
    [switch]$server,
    [switch]$devicebay
 )

    if ($network.IsPresent) { $item = "network"}
    elseif ($profile.IsPresent) {$item = "profile"}
    elseif ($server.IsPresent) {$item = "server"}
    elseif ($devicebay.IsPresent){$item = "devicebay"}

    $command = "show $item -output=script2"
}

显然,这可以进行优化,但我正在努力解决如何实现它。是否有一些简单的方法可以确保只接受和使用单个参数而无需使用多个elseif语句?
此外,我想提供一系列参数,而不是像现在这样做。

4 个答案:

答案 0 :(得分:14)

您可以做的另一件事是使用[ValidateSet]

而不是所有这些切换参数
function Get-Data{
    [cmdletbinding()]

    param(
        [Parameter(Mandatory=$true)]
        [ValidateSet('Network','Profile','Server','DeviceBay')]
        [string]$Item
    )

    Switch ($Item){
        'network' {'Do network stuff'}
        'profile' {'Do profile stuff'}
        'server' {'Do server stuff'}
        'devicebay' {'Do devicebay stuff'}
    }
}

答案 1 :(得分:9)

可能不是最优雅的解决方案,但使用参数使powershell能够为您完成一些工作:

#requires -version 2.0

function Get-data {
    [cmdletbinding()]

    param(
        [parameter(parametersetname="network")]
        [switch]$network,
        [parameter(parametersetname="profile")]
        [switch]$profile,
        [parameter(parametersetname="server")]
        [switch]$server,
        [parameter(parametersetname="devicebay")]
        [switch]$devicebay
    )

    $item = $PsCmdlet.ParameterSetName

    $command = "show $item -output=script2"
}

如果您没有提供其中一个交换机,此示例将会出错,但是如果您想要考虑这种情况,您可能会提供一个额外的开关,它不会做任何事情或错误更优雅......

答案 2 :(得分:7)

您可以添加[cmdletbinding()]关键字,以便获得$PSBoundParameters,并将其用于切换管道:

function Get-data{
    [cmdletbinding()]

    param (
        [switch]$network,
        [switch]$profile,
        [switch]$server,
        [switch]$devicebay
     )
     Switch ($PSBoundParameters.GetEnumerator().
      Where({$_.Value -eq $true}).Key)
     {
       'network'    { 'Do network stuff' }
       'profile'    { 'Do profile stuff'  }
       'server'     { 'Do server stuff' }
       'devicebay'  { 'Do devicebay stuff' }
     }
}

答案 3 :(得分:1)

由于您只想启用一个开关,因此枚举可能会对您有所帮助。 这样,您不使用开关而是使用标准参数 - 仍然,cmdlet的用户可以使用TAB自动填充可能输入的值。

只需将参数类型设置为枚举。