$UserChoice = Read-Host "Enter # of tool you want to run"
switch -exact ($UserChoice) {
1 {Write-Host 'You selected 1'}
1a {Write-Host 'You selected 1a'}
1b {Write-Host 'You selected 1b'}
1c {Write-Host 'You selected 1c'}
1d {Write-Host 'You selected 1d'}
}
前言:我知道解決方法是將比較值放在引號中,例如:'1d'。我想知道為什么 PowerShell 這樣做是為了學習。
- 如果我在提示符處輸入 1b,它會回傳 1b,而如果我輸入 1d,它什么也不回傳,為什么?
- 如果我在提示符下輸入 1b,它會回傳 1b,而如果我輸入 1,它會回傳 1 和 1d,為什么?
- 由于某種原因,PowerShell 似乎在 switch 陳述句比較值中解釋了 d,為什么?
--編輯:我只是注意到視覺上的比較值是不同的顏色(1 和 1d 更暗)所以我猜 PowerShell ISE 語法突出顯示告訴我們它們被區別對待。4. 顏色是什么意思(栗色/深紅色或紫色 VS 紫色?

uj5u.com熱心網友回復:
在解釋為什么1d標簽是“特殊”之前,我應該注意-exact模式(這是switch陳述句的默認比較模式)可能有點誤導。
它只是意味著“使用-eq運算子將??輸入值與案例標簽進行比較”。
行為不同的原因1d是PowerShell 不將運算式識別1d為 string。相反,它解釋d為表示[decimal]型別的數字后綴,因此 case 標簽值與您撰寫的相同1.0or $([decimal]1)。
結果是,由于 PowerShell 的多載運算子"1",兩者與輸入字串的比較結果相同 -"1" -eq 1并且"1" -eq 1d都是正確的。
如果您進一步擴展您的選項,您將遇到與1l( l= [long]) 相同的問題,如果使用 PowerShell 7,最終會出現1n、1s、1u和1y.
參考開關標簽以避免 PowerShell 將它們決議為數字運算式:
$UserChoice = Read-Host "Enter # of tool you want to run"
switch -exact ($UserChoice) {
'1' {Write-Host 'You selected 1'}
'1a' {Write-Host 'You selected 1a'}
'1b' {Write-Host 'You selected 1b'}
'1c' {Write-Host 'You selected 1c'}
'1d' {Write-Host 'You selected 1d'}
}
有關 PowerShell 解釋為數字修飾符的后綴的更全面概述,請參閱about_Numeric_Literals幫助主題。
uj5u.com熱心網友回復:
添加到Mathias 的出色答案:
陳述句的
switch分支條件絕不應該允許使用裸詞(未加引號的標記用作字串)。這相當于 PowerShell 的兩種基本決議模式(引數模式和運算式模式)的不當混合。
- 在運算式模式下——這是適用的——字串必須被參考;例如,要匹配帶有逐字值的字串
1d,它必須表示為'1d',這可以消除它與數字文字1da的歧義[decimal]。
- 在運算式模式下——這是適用的——字串必須被參考;例如,要匹配帶有逐字值的字串
有關討論,請參閱GitHub 問題 #3668。
該
-exact開關選擇了默認行為,并且鑒于此行為的不確切性質,它被命名為.- 因此, GitHub 問題 #8599建議(軟)棄用它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454123.html
