gre*_*egg 4 powershell switch-statement
$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'}
}
Run Code Online (Sandbox Code Playgroud)
前言:我知道解决方法是将比较值放在引号中,例如:'1d'。我想知道为什么 PowerShell 这样做是为了学习。
我注意到比较值的颜色不同(1 和 1d 更暗),所以我猜 PowerShell ISE 语法突出显示告诉我们它们受到了不同的对待。4. 颜色的含义是什么(栗色/深红色或紫色 VS 紫色?

在解释为什么1d标签是“特殊”之前,我应该注意模式-exact(这是语句的默认比较模式switch)可能有点误导。
它只是意味着“使用-eq运算符将输入值与案例标签进行比较”。
行为不同的原因1d是PowerShell 无法将表达式识别1d为字符串。相反,它解释d为表示类型的数字后缀,因此 case 标签值与您编写的or[decimal]相同。1.0$([decimal]1)
结果是,与输入字符串的比较"1"对于两者来说都是相同的 -"1" -eq 1并且"1" -eq 1d都是 true,这要归功于 PowerShell 的重载运算符。
如果您进一步扩展您的选项,您将遇到与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'}
}
Run Code Online (Sandbox Code Playgroud)
有关 PowerShell 解释为数字修饰符的后缀的更全面概述,请参阅about_Numeric_Literals帮助主题。