$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'} } Prefacio: sé que la solución es poner los valores de comparación entre comillas, por ejemplo: '1d' . Quiero saber POR QUÉ PowerShell está actuando de la manera en que lo hace por el bien del aprendizaje.
--EDITAR: Acabo de notar VISUALMENTE que los valores de comparación son de diferentes colores (1 y 1d son más oscuros), así que supongo que el resaltado de sintaxis de PowerShell ISE nos dice que están siendo tratados de manera diferente. 4. ¿Qué significan los colores (maroon/dark-RedOrPurple VS purple? 
Antes de explicar por qué la etiqueta 1d es "especial", debo señalar que el modo -exact (que es el modo predeterminado de comparación para una declaración de switch ) es probablemente un poco engañoso.
Simplemente significa "usar el operador -eq para comparar los valores de entrada con las etiquetas de los casos".
La razón por la que 1d se comporta de manera diferente es que PowerShell no reconoce la expresión 1d como una cadena . En cambio, interpreta que d es un sufijo numérico que significa el tipo [decimal] y, por lo tanto, el valor de la etiqueta de mayúsculas y minúsculas es el mismo que si hubiera escrito 1.0 o $([decimal]1) .
El resultado es que la comparación con la cadena de entrada "1" sale igual para ambos: "1" -eq 1 y "1" -eq 1d son verdaderos, gracias a los operadores sobrecargados de PowerShell.
Si alguna vez amplía más sus opciones, encontrará el mismo problema con 1l ( l = [long] ) y, si usa PowerShell 7, eventualmente 1n , 1s , 1u y 1y .
Cita las etiquetas de los interruptores para evitar que PowerShell las analice como expresiones numéricas:
$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'} }Consulte el tema de ayuda about_Numeric_Literals para obtener una descripción general más completa de los sufijos interpretados como modificadores numéricos por PowerShell.
Para agregar a la excelente respuesta de Mathias :
Los condicionales de la rama de la instrucción switch nunca deberían haber permitido el uso de palabras vacías (tokens sin comillas que sirven como cadenas ).
Equivale a una combinación inapropiada de los dos modos de análisis fundamentales de PowerShell, el modo de argumento y el modo de expresión .
1d , debe representarse como '1d' , lo que elimina la ambigüedad del número literal 1d , un [decimal] .Consulte el problema n.º 3668 de GitHub para ver una discusión.
El -exact opta por el comportamiento predeterminado y, dada la naturaleza no exacta de este comportamiento, se denomina de forma confusa .