Powershell 如何将交换机嵌套在外部和内部?

Powershell 如何将交换机嵌套在外部和内部?,powershell,Powershell,假设我有以下param cmdlet [CmdletBinding(DefaultParameterSetName='View')] Param( [Parameter(ParameterSetName='ChangeOne', Mandatory=$true)] [Switch]$ChangeOne, [Parameter(ParameterSetName='ChangeAll', Mandatory=$true)] [Switch]$ChangeAll,

假设我有以下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
)
假设我需要一个用于
ChangeAll
视图的
foreach
,但不用于
ChangeOne
。在这种情况下,如何嵌套switch语句

我在寻找的伪代码…我就是这样做的吗

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

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

您可以使用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 () {
    }
}
另一种方法是继续使用
开关
并设置默认条件

[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 () {}
    }
}

您可以使用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 () {
    }
}
另一种方法是继续使用
开关
并设置默认条件

[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 () {}
    }
}

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

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

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

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

因此,在foreach内部,我也可以保留以下内容:switch($PSCmdlet.ParameterSetName){'ChangeAll'{…}'视图{…}}Yes。你可以。这里的总体目标是什么?总体目标是无论用户通过什么开关,它都将执行代码的特定部分。您是否只是试图在多个位置不重复相同的foreach语句?如果是这样,您可能需要稍微更改switch语句或使用If语句。换句话说,即使ChangeAll和View开关也有不同的代码部分,但它们都在foreach($Servers中的server)中,另一方面,ChnageOne不需要在foreach()中因为我要将服务器作为用户输入单独传递给它,所以在foreach中,我也可以保留以下内容:switch($PSCmdlet.ParameterSetName){'ChangeAll'{…}'View'{…}Yes。你可以。这里的总体目标是什么?总体目标是无论用户通过什么开关,它都将执行代码的特定部分。您是否只是试图在多个位置不重复相同的foreach语句?如果是这样,您可能需要稍微更改switch语句或使用If语句。换句话说,即使ChangeAll和View开关也有不同的代码部分,但它们都在foreach($Servers中的server)中,另一方面,ChnageOne不需要在foreach()中因为我将一个服务器作为用户输入单独传递给它,所以在foreach内部,我也可以保留以下内容:switch($PSCmdlet.ParameterSetName){'ChangeAll'{…}'View'{…}}@Cataster当然可以,但我看不出有多少理由为单个条件使用
switch
。您可以在
foreach
内部使用single
if
。因此,在foreach内部,我也可以保留以下内容:switch($PSCmdlet.ParameterSetName){'ChangeAll'{…}'View'{…}@Cataster当然可以,但我看不出有多少理由在单个条件下使用
switch
。您可以在
foreach
的内部使用single
if