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)
可能不是最优雅的解决方案,但使用参数使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)
如果你没有提供其中一个开关,这个例子就会出错,但如果你想考虑那个案例,你可能会提供一个额外的开关,什么都不做,或者错误更优雅......
您可以添加[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)