2012-08-13 67 views
1

嗨,我有下面的代碼,並希望知道使用switch語句替換它的最佳方式。此示例我有4個可能的結果,但我可能會結束超過20和if語句會變得混亂。使用開關語句,而不是多個IF的

$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" 

回答

1

我最終找出了一些可行的事情讓我知道你們都在想什麼。

$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 
4

對於您發佈,我個人會使用嵌套,如果使邏輯更清晰的例子:

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。如果我正在閱讀你正確發佈的內容,邏輯表格會在下面發佈。再次,嵌套如果將幫助解決它。

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

葉我有嵌套的IF語句相同的問題,如果得到複雜,很難找出狀態。 – justinf 2012-08-13 13:34:54

+0

只有4個州,這不是太糟糕。你在你的問題中提到了20種可能性。在這種情況下,開關可能是正確的,但你沒有進一步解釋。所以對於4個州,我會說If-Then是對的。 – EBGreen 2012-08-13 13:38:20

+0

你會有大約20個可能的,非常不同的國家不想舉一個大的例子聽到,因爲它很難遵循,如果我有一個例子與4將很容易改變它。同樣從我的代碼你可以看到我評估多個事情來確定每個狀態,例如((Test-Path $ Des)-ne $ false-和$ DListFiles -ne $ null應該是狀態2但((Test-Path $ Des) -ne $ false - 和$ DListFiles --eq $ null應該爲狀態1 – justinf 2012-08-13 14:21:15