Acerca de Switch

Descripción breve

Explica cómo usar un modificador para controlar varias If instrucciones.

Descripción larga

Para comprobar una condición en un script o una función, use una instrucción If. La instrucción If puede comprobar muchos tipos de condiciones, incluido el valor de las variables y las propiedades de los objetos.

Para comprobar varias condiciones, utilice una instrucción Switch. La instrucción Switch es equivalente a una serie de instrucciones If, pero es más sencilla. La instrucción Switch enumera cada condición y una acción opcional. Si se cumple una condición, se realiza la acción.

La instrucción Switch puede usar el $_ y $switch variables automáticas. Para obtener más información, consulte sobre_Variables_Automáticas.

Una instrucción Switch básica tiene el siguiente formato:

Switch (<test-value>)
{
    <condition> {<action>}
    <condition> {<action>}
}

Por ejemplo, la siguiente Switch instrucción compara el valor de prueba, 3, con cada una de las condiciones. Cuando el valor de prueba coincide con la condición, se realiza la acción.

switch (3)
{
    1 {"It is one."}
    2 {"It is two."}
    3 {"It is three."}
    4 {"It is four."}
}
It is three.

En este ejemplo sencillo, el valor se compara con cada condición de la lista, aunque haya una coincidencia para el valor 3. La siguiente instrucción Switch tiene dos condiciones para un valor de 3. Muestra que, de forma predeterminada, se prueban todas las condiciones.

switch (3)
{
    1 {"It is one."}
    2 {"It is two."}
    3 {"It is three."}
    4 {"It is four."}
    3 {"Three again."}
}
It is three.
Three again.

Para dirigir a Switch que deje de compararse después de una coincidencia, use la Break instrucción . La Break instrucción finaliza la Switch instrucción .

switch (3)
{
    1 {"It is one."}
    2 {"It is two."}
    3 {"It is three."; Break}
    4 {"It is four."}
    3 {"Three again."}
}
It is three.

Si el valor de prueba es una colección, como una matriz, cada elemento de la colección se evalúa en el orden en que aparece. En los ejemplos siguientes se evalúan 4 y 2.

switch (4, 2)
{
    1 {"It is one." }
    2 {"It is two." }
    3 {"It is three." }
    4 {"It is four." }
    3 {"Three again."}
}
It is four.
It is two.

Las Break instrucciones se aplican a la colección, no a cada valor, como se muestra en el ejemplo siguiente. La Switch instrucción finaliza mediante la Break instrucción en la condición del valor 4.

switch (4, 2)
{
    1 {"It is one."; Break}
    2 {"It is two." ; Break }
    3 {"It is three." ; Break }
    4 {"It is four." ; Break }
    3 {"Three again."}
}
It is four.

Sintaxis

La sintaxis de instrucción Switch completa es la siguiente:

switch [-regex|-wildcard|-exact][-casesensitive] (<value>)
{
    "string"|number|variable|{ expression } { statementlist }
    default { statementlist }
}

o

switch [-regex|-wildcard|-exact][-casesensitive] -file filename
{
    "string"|number|variable|{ expression } { statementlist }
    default { statementlist }
}

Si no se usa ningún parámetro, Switch se comporta igual que el uso del parámetro Exact. Realiza una coincidencia que no distingue mayúsculas de minúsculas para el valor. Si el valor es una colección, cada elemento se evalúa en el orden en que aparece.

La instrucción Switch debe incluir al menos una instrucción condition.

La cláusula Default se desencadena cuando el valor no coincide con ninguna de las condiciones. Es equivalente a una cláusula Else en una instrucción If. Solo se permite una cláusula Default en cada instrucción Switch.

Switch tiene los parámetros siguientes:

  • comodín: indica que la condición es una cadena comodín. Si la cláusula match no es una cadena, se omite el parámetro . La comparación no distingue mayúsculas de minúsculas.
  • exacto: indica que la cláusula match, si es una cadena, debe coincidir exactamente. Si la cláusula match no es una cadena, este parámetro se omite. La comparación no distingue mayúsculas de minúsculas.
  • caseSensitive: realiza una coincidencia que distingue mayúsculas de minúsculas. Si la cláusula match no es una cadena, este parámetro se omite.
  • Archivo: toma la entrada de un archivo en lugar de una instrucción de valor. Si se incluyen varios parámetros File, solo se usa el último. La instrucción Switch lee y evalúa cada línea del archivo. La comparación no distingue mayúsculas de minúsculas.
  • regex: realiza la coincidencia de expresiones regulares del valor con la condición. Si la cláusula match no es una cadena, este parámetro se omite. La comparación no distingue mayúsculas de minúsculas. La variable automática $matches está disponible para su uso en el bloque de instrucciones coincidente.

Nota:

Al especificar valores en conflicto, como regex y comodín, el último parámetro especificado tiene prioridad y se omiten todos los parámetros en conflicto. También se permiten varias instancias de parámetros. Sin embargo, solo el último parámetro utilizado es efectivo.

En este ejemplo, un objeto que no es una cadena o datos numéricos se pasa a .Switch Switch realiza una coerción de cadena en el objeto y evalúa el resultado.

$test = @{
    Test  = 'test'
    Test2 = 'test2'
}

$test.ToString()

switch -Exact ($test)
{
    'System.Collections.Hashtable'
    {
        'Hashtable string coercion'
    }
    'test'
    {
        'Hashtable value'
    }
}
System.Collections.Hashtable
Hashtable string coercion

En este ejemplo, no hay ningún caso coincidente, por lo que no hay ninguna salida.

switch ("fourteen")
{
    1 {"It is one."; Break}
    2 {"It is two."; Break}
    3 {"It is three."; Break}
    4 {"It is four."; Break}
    "fo*" {"That's too many."}
}

Si agrega la cláusula Default, puede realizar una acción cuando ninguna otra condición se realice correctamente.

switch ("fourteen")
{
    1 {"It is one."; Break}
    2 {"It is two."; Break}
    3 {"It is three."; Break}
    4 {"It is four."; Break}
    "fo*" {"That's too many."}
    Default {
        "No matches"
    }
}
No matches

Para que la palabra "catorce" coincida con un caso, debe usar el parámetro -Wildcard o -Regex.

   PS> switch -Wildcard ("fourteen")
       {
           1 {"It is one."; Break}
           2 {"It is two."; Break}
           3 {"It is three."; Break}
           4 {"It is four."; Break}
           "fo*" {"That's too many."}
       }
That's too many.

En el ejemplo siguiente se usa el parámetro -Regex.

$target = 'https://bing.com'
switch -Regex ($target)
{
    '^ftp\://.*$' { "$_ is an ftp address"; Break }
    '^\w+@\w+\.com|edu|org$' { "$_ is an email address"; Break }
    '^(http[s]?)\://.*$' { "$_ is a web address that uses $($matches[1])"; Break }
}
https://bing.com is a web address that uses https

Una condición de instrucción Switch puede ser:

  • Expresión cuyo valor se compara con el valor de entrada
  • Un bloque de script que debe devolverse $true si se cumple una condición.

La $_ variable automática contiene el valor pasado a la instrucción switch y está disponible para su evaluación y uso dentro del ámbito de las instrucciones de condición.

La acción para cada condición es independiente de las acciones en otras condiciones.

En el ejemplo siguiente se muestra el uso de bloques de script como condiciones de instrucción Switch.

switch ("Test")
{
    {$_ -is [String]} {
        "Found a string"
    }
    "Test" {
        "This $_ executes as well"
    }
}
Found a string
This Test executes as well

Si el valor coincide con varias condiciones, se ejecuta la acción de cada condición. Para cambiar este comportamiento, use las palabras clave Break o Continue.

La palabra clave Break detiene el procesamiento y sale de la instrucción Switch.

La palabra clave Continue detiene el procesamiento del valor actual, pero continúa procesando los valores posteriores.

En el ejemplo siguiente se procesa una matriz de números y se muestra si son impares o incluso. Los números negativos se omiten con la palabra clave Continue. Si se encuentra un no número, la ejecución finaliza con la palabra clave Break.

switch (1,4,-1,3,"Hello",2,1)
{
    {$_ -lt 0} { Continue }
    {$_ -isnot [Int32]} { Break }
    {$_ % 2} {
        "$_ is Odd"
    }
    {-not ($_ % 2)} {
        "$_ is Even"
    }
}
1 is Odd
4 is Even
3 is Odd

Consulte también

about_Break

about_Continue

about_If

about_Script_Blocks