如何在内部和外部嵌套开关?

时间:2019-05-14 15:19:24

标签: powershell

假设我具有以下param cmdlet

[CmdletBinding(DefaultParameterSetName='View')]
Param(
    [Parameter(ParameterSetName='ChangeOne', Mandatory=$true)]
    [Switch]$ChangeOne,

    [Parameter(ParameterSetName='ChangeAll', Mandatory=$true)]
    [Switch]$ChangeAll,

    [Parameter(ParameterSetName='View', Mandatory=$false)]
    [Switch]$View
)

假设我需要一个foreachChangeAll的一个View,而不是ChangeOne的一个。在这种情况下,如何嵌套switch语句?

我正在寻找的伪代码...这是我怎么做的?

switch ($PSCmdlet.ParameterSetName)
{
        'ChangeOne'
        {...}

 foreach ($server in $Servers)
 {
     switch ($PSCmdlet.ParameterSetName)
     {
        'ChangeAll'
         {...}
        'View'
         {...}
     }
 }
}

2 个答案:

答案 0 :(得分:1)

您可以使用IF语句和-in运算符来完成此操作。

[CmdletBinding(DefaultParameterSetName='View')]
Param(
    [Parameter(ParameterSetName='ChangeOne', Mandatory=$true)]
    [Switch]$ChangeOne,

    [Parameter(ParameterSetName='ChangeAll', Mandatory=$true)]
    [Switch]$ChangeAll,

    [Parameter(ParameterSetName='View', Mandatory=$false)]
    [Switch]$View
)

if ($PSCmdlet.ParameterSetName -in 'View','ChangeAll') {
    foreach () {
    }
}

您可以使用-notin运算符采取类似的方法。使用-notin,如果您以后选择添加更多参数集,它们将自动评估为true。

if ($PSCmdlet.ParameterSetName -notin 'ChangeOne') {
    foreach () {
    }
}

另一种方法是继续使用Switch并设置默认条件。

[CmdletBinding(DefaultParameterSetName='View')]
Param(
    [Parameter(ParameterSetName='ChangeOne', Mandatory=$true)]
    [Switch]$ChangeOne,

    [Parameter(ParameterSetName='ChangeAll', Mandatory=$true)]
    [Switch]$ChangeAll,

    [Parameter(ParameterSetName='View', Mandatory=$false)]
    [Switch]$View
)

switch ($PSCmdlet.ParameterSetName) {
    'ChangeOne' { }
    Default {
       foreach () {}
    }
}

答案 1 :(得分:1)

这是一种非常简单的方法。检查是否指定了$ChangeAll$View。如果不是,则为$ChangeOne

if($ChangeAll -or $View){
   foreach ...
} else { 
   # ChangeOne will go here
   ...
}