Básicamente quiero hacer esto:¿Cuál es la sintaxis de powershell para valores múltiples en una instrucción switch?
switch($someString.ToLower())
{
"y", "yes" { "You entered Yes." }
default { "You entered No." }
}
Básicamente quiero hacer esto:¿Cuál es la sintaxis de powershell para valores múltiples en una instrucción switch?
switch($someString.ToLower())
{
"y", "yes" { "You entered Yes." }
default { "You entered No." }
}
switch($someString.ToLower())
{
{($_ -eq "y") -or ($_ -eq "yes")} { "You entered Yes." }
default { "You entered No." }
}
Usted debe ser capaz de utilizar un comodín para sus valores:
switch -wildcard ($someString.ToLower())
{
"y*" { "You entered Yes." }
default { "You entered No." }
}
expresiones regulares también están permitidos.
switch -regex ($someString.ToLower())
{
"y(es)?" { "You entered Yes." }
default { "You entered No." }
}
Powershell documentación del conmutador: http://technet.microsoft.com/en-us/library/ff730937.aspx
Esta es una gran solución, aunque "técnicamente", ya que estaba pidiendo usar valores separados, he marcado fletcher como la respuesta. – Micah
Bastante bien, aunque una expresión regular diferente probablemente podría hacer lo mismo. – derekerdmann
El enfoque Regex sería más conciso. – mseery
Soporta entrar y | os | sí y entre mayúsculas y minúsculas.
switch -regex ($someString.ToLower()) {
"^y(es?)?$" {
"You entered Yes."
}
default { "You entered No." }
}
En realidad, su expresión "[sí]" coincide con cualquier aparición de los caracteres 'y', 'e' o 's' en cualquier lugar en $ someString. Incluso si $ someString es "no! No! No! S", ese bloque cambiará "Ingresó Sí". debido a los 's' finales. Para unir y | ye | sí, la expresión debería ser "^ y (es?)? $". – BACON
Sé que esto es un hilo viejo, pero he encontrado que esto funciona y parece más legible:
switch($someString)
{
{ @("y", "yes") -contains $_ } { "You entered Yes." }
default { "You entered No." }
}
El "-Contiene" operador realiza una búsqueda no sensible al caso, por lo que don' Necesito usar "ToLower()". Si desea que sea sensible a mayúsculas y minúsculas, puede usar "-concontiene" en su lugar.
Después de buscar una solución para el mismo problema que usted, he encontrado este pequeño tema aquí. De antemano me dieron una solución mucho más suave para este interruptor, declaración de caso
switch($someString) #switch is caseINsensitive, so you don't need to lower
{
{ 'y' -or 'yes' } { "You entered Yes." }
default { "You entered No." }
}
{'y' -o 'yes'} siempre evalúa como verdadero para que la rama predeterminada nunca llegue a –
switch($someString.ToLower())
{
"yes" { $_ = "y" }
"y" { "You entered Yes." }
default { "You entered No." }
}
Puede arbitrariamente ramificar, cascada, y combinar los casos de esta manera, siempre y cuando la meta caso se encuentra abajo/después el caso o casos donde la variable $ _ se reasigna respectivamente.
n.b. A pesar de lo lindo que es este comportamiento, parece revelar que el intérprete de PowerShell no está implementando el switch/case tan eficientemente como uno podría esperar o asumir. Por un lado, avanzar con el depurador ISE sugiere que, en lugar de una búsqueda optimizada, hashing o binario, cada caso se prueba uno por uno, como tantas sentencias if-else. (De ser así, considere poner sus casos más comunes primero). Además, como se muestra en esta respuesta, PowerShell continúa probando casos después de haber satisfecho uno. Y lo suficientemente cruel, incluso resulta que hay un código de operación de 'cambio' optimizado especial disponible en .NET CIL que, debido a este comportamiento, PowerShell no puede aprovechar.
No es lindo, está documentado. Agregue una declaración de interrupción si no desea que se evalúen las ramas subsiguientes. – Frank
@Frank Bastante, "lindo" puede no haber sido la mejor palabra para referirse a un comportamiento de palabra clave que es alterado o atípico en relación con su semántica histórica en numerosos idiomas desde 'C' (1975) o antes. –
Una pequeña modificación en la publicación de derekerdmann para cumplir con la solicitud original utilizando el operador de alternancia de regex "|" (tubería).
También es un poco más fácil de entender y leer para los recién nacidos regex.
Tenga en cuenta que al usar regex, si no pone el carácter de inicio "^" (caret/circunflex) y/o el carácter de final de cadena "$" (dólar), puede obtener un comportamiento inesperado/poco intuitivo (como coincidencia "ayer" o "por qué").
Poniendo los caracteres de agrupamiento "()" (paréntesis) alrededor de las opciones reduce la necesidad de poner el inicio y el final de los caracteres de cadena para cada opción. Sin ellos, obtendrás un comportamiento inesperado si no eres experto en expresiones regulares. Por supuesto, si no está procesando la entrada del usuario, sino más bien un conjunto de cadenas conocidas, será más legible sin agrupar e iniciar y finalizar caracteres de cadena.
switch -regex ($someString) #many have noted ToLower() here is redundant
{
#processing user input
"^(y|yes|indubitably)$" { "You entered Yes." }
# not processing user input
"y|yes|indubitably" { "Yes was the selected string" }
default { "You entered No." }
}
también puede hacer '{$ _ -in" y "," yes "}' pero no estoy seguro desde qué versión de PS. – tkokasih
@wannabeprogrammer [El operador ** In ** se introdujo en Windows PowerShell 3.0.] (Https://technet.microsoft.com/en-us/library/hh847759.aspx) –
-eq no distingue entre mayúsculas y minúsculas al realizar una comparación de cadenas entonces ToLower no es necesario –