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

Ser*_*gei 5 parameters powershell 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"
}
Run Code Online (Sandbox Code Playgroud)

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

E.V*_*.L. 15

您可以做的另一件事而不是所有那些开关参数是使用a [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'}
    }
}
Run Code Online (Sandbox Code Playgroud)


Hun*_*son 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"
}
Run Code Online (Sandbox Code Playgroud)

如果你没有提供其中一个开关,这个例子就会出错,但如果你想考虑那个案例,你可能会提供一个额外的开关,什么都不做,或者错误更优雅......


mjo*_*nor 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' }
     }
}
Run Code Online (Sandbox Code Playgroud)