Powershell switch语句比较值1d飘忽不定,为什么?

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. 如果我在提示时输入 1b,它会返回 1b,而如果我输入 1d,它不会返回任何内容,为什么?
  2. 如果我在提示时输入 1b,它会返回 1b,而如果我输入 1,它会返回 1 和 1d,为什么?
  3. 似乎 PowerShell 正在解释 switch 语句中的 d 比较值由于某种原因而不同,为什么?

我注意到比较值的颜色不同(1 和 1d 更暗),所以我猜 PowerShell ISE 语法突出显示告诉我们它们受到了不同的对待。4. 颜色的含义是什么(栗色/深红色或紫色 VS 紫色? 在此输入图像描述

Mat*_*sen 6

在解释为什么1d标签是“特殊”之前,我应该注意模式-exact(这是语句的默认比较模式switch)可能有点误导。

它只是意味着“使用-eq运算符将​​输入值与案例标签进行比较”。

行为不同的原因1dPowerShell 无法将表达式识别1d为字符串。相反,它解释d为表示类型的数字后缀,因此 case 标签值与您编写的or[decimal]相同。1.0$([decimal]1)

结果是,与输入字符串的比较"1"对于两者来说都是相同的 -"1" -eq 1并且"1" -eq 1d都是 true,这要归功于 PowerShell 的重载运算符

如果您进一步扩展您的选项,您将遇到与1l( l= [long]) 相同的问题,并且,如果使用 PowerShell 7,最终会遇到1n1s1u1y

引用开关标签以避免 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帮助主题。