Powershell 使用switch语句而不是多个IF';s

Powershell 使用switch语句而不是多个IF';s,powershell,switch-statement,Powershell,Switch Statement,嗨,我有下面的代码,我想知道用switch语句替换它的最佳方法。这个例子我有4个可能的结果,但我可能会得到超过20个,如果语句变得混乱的话 $Des = "C:\tools\" $DListFiles = Get-ChildItem $Des -EA 0 IF((Test-Path $Des)-ne $false -and $DListFiles -eq $null){$DDE = 1} ElseIF((Test-Path $Des)-ne $false -and $DListFiles -n

嗨,我有下面的代码,我想知道用switch语句替换它的最佳方法。这个例子我有4个可能的结果,但我可能会得到超过20个,如果语句变得混乱的话

$Des = "C:\tools\"
$DListFiles = Get-ChildItem $Des -EA 0

IF((Test-Path $Des)-ne $false -and $DListFiles -eq $null){$DDE = 1}
ElseIF((Test-Path $Des)-ne $false -and $DListFiles -ne $null){$DDE = 2}
ElseIF((Test-Path $Des)-eq $false){$DDE = 3}
Else{$DDE = 4}

write-host "$DDE"

对于您发布的示例,我个人会使用嵌套的if来让逻辑更清晰:

If(Test-Path $Des){
    If($DListFiles -eq $null){
        $DDE = 1
    }Else{
        $DDE = 2
    }
}Else{
    If($DListFiles -eq $null){
        $DDE = 3
    }else{
        $DDE = 4
    }
}
顺便说一句,你写的方式并没有给出我认为你想要的逻辑。我不相信你会得到$DDE=2。如果我正确阅读了您发布的内容,逻辑表将发布在下面。同样,嵌套的If将有助于解决问题

Test-Path   $Dlist is Null      $DDE
TRUE            TRUE            1
FALSE           FALSE           3
TRUE            TRUE            4
FALSE           FALSE           3

对于您发布的示例,我个人会使用嵌套的if来让逻辑更清晰:

If(Test-Path $Des){
    If($DListFiles -eq $null){
        $DDE = 1
    }Else{
        $DDE = 2
    }
}Else{
    If($DListFiles -eq $null){
        $DDE = 3
    }else{
        $DDE = 4
    }
}
顺便说一句,你写的方式并没有给出我认为你想要的逻辑。我不相信你会得到$DDE=2。如果我正确阅读了您发布的内容,逻辑表将发布在下面。同样,嵌套的If将有助于解决问题

Test-Path   $Dlist is Null      $DDE
TRUE            TRUE            1
FALSE           FALSE           3
TRUE            TRUE            4
FALSE           FALSE           3

我终于想出了一些可行的办法让我知道你们的想法

$Des = "c:\test\"
$DListFiles = Get-ChildItem $Des -EA 0

Switch($Des)
   {  {!$Des} {$DDE = 4; break}
      {((Test-Path $Des)-ne $false -and $DListFiles -eq $null)}  {$DDE = 1; break}
      {((Test-Path $Des)-ne $false -and $DListFiles -ne $null)}  {$DDE = 2; break}
      {((Test-Path $Des)-eq $false)}                             {$DDE = 3; break}
   }

 $DDE

我终于想出了一些可行的办法让我知道你们的想法

$Des = "c:\test\"
$DListFiles = Get-ChildItem $Des -EA 0

Switch($Des)
   {  {!$Des} {$DDE = 4; break}
      {((Test-Path $Des)-ne $false -and $DListFiles -eq $null)}  {$DDE = 1; break}
      {((Test-Path $Des)-ne $false -and $DListFiles -ne $null)}  {$DDE = 2; break}
      {((Test-Path $Des)-eq $false)}                             {$DDE = 3; break}
   }

 $DDE

Ye我也有同样的问题,嵌套的IF语句IF变得复杂,很难判断状态。对于4个状态来说,这并不太糟糕。你在问题中提到了大约20种可能性。在这种情况下,切换可能是正确的,但您没有进一步解释。所以对于4个州,我会说,如果那是正确的。大约有20个可能的州,非常不同的州不想提出一个大的例子,因为这很难遵循,如果我得到一个4的例子,很容易改变它。另外,从我的代码中,您可以看到我计算了多个东西来确定每个状态,例如((测试路径$Des)-ne$false-和$DListFiles-ne$null应该是状态2,但是((测试路径$Des)-ne$false和$DListFiles——eq$null通常应该是状态1,如果您有一个参数可以处于多个可能的状态,那么开关是最好的。如果您有多个参数可以处于多个状态,正如您注意到的那样,逻辑变得复杂。在这种情况下,开关以外的一些逻辑结构可能是最好的。实际上如果你有很多参数,每个参数只有两个状态,那么我个人会考虑使用位掩码来确定整体状态,然后根据该状态进行切换。你是否有一篇文章的链接或位掩码的示例?Ye我对嵌套的if语句也有同样的问题,如果它变得复杂且难以确定状态。仅4个说明这并不太糟糕。你在问题中说了大约20种可能性。在这种情况下,一个转换可能是正确的,但你没有进一步解释。所以对于4个州,我会说如果是正确的话。你会说大约有20种可能,非常不同的州不想举一个大的例子,因为很难听到如果我得到了一个4的例子,那么很容易改变它。从我的代码中你可以看到我计算了多个东西来确定每个状态,例如((测试路径$Des)-ne$false-和$DListFiles-ne$null应该是状态2,但是((测试路径$Des)-ne$false和$DListFiles——eq$null通常应该是状态1,如果您有一个参数可以处于多个可能的状态,那么开关是最好的。如果您有多个参数可以处于多个状态,正如您注意到的那样,逻辑变得复杂。在这种情况下,开关以外的一些逻辑结构可能是最好的。实际上如果你有很多参数,而每个参数只有两种状态,那么我个人会考虑使用位掩码来确定整体状态,然后根据该状态进行切换。你是否有指向某篇文章或位掩码示例的链接?