Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

332
Vistas
Valor de comparación de declaración de cambio de Powershell 1d errático, ¿por qué?
$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.

  1. Si ingreso 1b en el indicador, devuelve 1b mientras que si ingreso 1d no devuelve nada, ¿por qué?
  2. Si ingreso 1b en el indicador, devuelve 1b mientras que si ingreso 1 devuelve 1 y 1d, ¿por qué?
  3. Parece que PowerShell está interpretando d en un valor de comparación de declaración de cambio diferente por alguna razón, ¿por qué?

--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? ingrese la descripción de la imagen aquí

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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.

over 4 years ago · Santiago Trujillo Denunciar

0

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 .

      • En el modo de expresión, que es el apropiado para aplicar, las cadenas deben estar entre comillas; por ejemplo, para hacer coincidir una cadena con el valor textual 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 .

    • Por lo tanto , el problema de GitHub #8599 sugiere (suavemente) desaprobarlo .
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda