about_Switch

Descrição curta

Explica como usar uma opção para lidar com várias instruções if.

Descrição longa

Para verificar uma condição em um script ou função, use uma instrução if. A instrução if pode verificar muitos tipos de condições, incluindo o valor das variáveis e as propriedades dos objetos.

Para verificar várias condições, use uma instrução switch. A instrução switch é equivalente a uma série de instruções if, mas é mais simples. A instrução switch lista cada condição e uma ação opcional. Se uma condição for obtida, a ação será executada.

A instrução switch pode usar as variáveis automáticas $_ e $switch. Para obter mais informações, confira about_Automatic_Variables.

Sintaxe

Uma instrução switch básica tem o seguinte formato:

Switch (<test-expression>)
{
    <result1-to-be-matched> {<action>}
    <result2-to-be-matched> {<action>}
}

As instruções if equivalentes são:

if (<result1-to-be-matched> -eq (<test-expression>)) {<action>}
if (<result2-to-be-matched> -eq (<test-expression>)) {<action>}

O <test-expression> é uma expressão única avaliada no modo de expressão para retornar um valor.

O <result-to-be-matched> é uma expressão cujo valor é comparado ao valor de entrada. As expressões incluem valores literais (cadeias de caracteres ou números), variáveis e scriptblocks que retornam um valor booliano.

Qualquer valor não citado que não seja reconhecido como um número é tratado como uma cadeia de caracteres. Para evitar confusão ou conversão de cadeia de caracteres não intencional, você deve sempre citar valores de cadeia de caracteres. Coloque todas as expressões entre parênteses (), criando subexpressões, para garantir que a expressão seja avaliada corretamente.

É importante entender que o valor <result-to-be-matched> está no lado esquerdo da expressão de comparação. Isso significa que o resultado de <test-expression> está no lado direito, que pode ser convertido no tipo do valor do lado esquerdo para comparação. Para obter mais informações, consulte about_Comparison_Operators

O valor default é reservado para a ação que é usada quando não há outras correspondências.

A variável $_ automática contém o valor da expressão passada para a instrução switch e está disponível para avaliação e uso dentro do escopo das instruções <result-to-be-matched>.

A sintaxe completa da instrução switch é a seguinte:

switch [-regex | -wildcard | -exact] [-casesensitive] (<test-expression>)
{
    "string" | number | variable | { <value-scriptblock> } { <action-scriptblock> }
    default { <action-scriptblock> } # optional
}

ou

switch [-regex | -wildcard | -exact] [-casesensitive] -file filename
{
    "string" | number | variable | { <value-scriptblock> } { <action-scriptblock> }
    default { <action-scriptblock> }  # optional
}

Se nenhum parâmetro for usado, se comportará da mesma forma que usar o parâmetro Exato do . Ele executa uma correspondência que não diferencia maiúsculas de minúsculas para o valor. Se o valor for uma coleção, cada elemento será avaliado na ordem em que ele aparece.

A instrução switch deve incluir pelo menos uma instrução de condição.

A cláusula default é disparada quando o valor não corresponde a nenhuma das condições. É equivalente a uma cláusula else em uma instrução if. Somente uma cláusula default é permitida em cada instrução switch.

switch tem os seguintes parâmetros:

  • Wildcard - indica que a condição é uma cadeia de caracteres curinga. Se a cláusula match não for uma cadeia de caracteres, o parâmetro será ignorado. A comparação não diferencia maiúsculas de minúsculas.
  • Exact – indica que a cláusula match, se for uma cadeia de caracteres, deve corresponder exatamente. Se a cláusula match não for uma cadeia de caracteres, esse parâmetro será ignorado. A comparação não diferencia maiúsculas de minúsculas.
  • CaseSensitive – executa uma correspondência que diferencia maiúsculas de minúsculas. Se a cláusula match não for uma cadeia de caracteres, esse parâmetro será ignorado.
  • File– obtém a entrada de um arquivo em vez de uma <test-expression>. Caso vários parâmetros de arquivo sejam incluídos, somente o último será usado. Cada linha do arquivo é lida e avaliada pela instrução switch. A comparação não diferencia maiúsculas de minúsculas.
  • regex – realiza a correspondência de expressões regulares entre o valor e a condição. Se a cláusula match não for uma cadeia de caracteres, esse parâmetro será ignorado. A comparação não diferencia maiúsculas de minúsculas. A variável $matches automática está disponível para uso no bloco de instrução correspondente.

Observação

Ao especificar valores conflitantes, como Regex e curinga, o último parâmetro especificado tem precedência e todos os parâmetros conflitantes são ignorados. Várias instâncias de parâmetros também são permitidas. No entanto, somente o último parâmetro listado é usado.

Exemplos

No exemplo a seguir, a instrução switch compara o valor do teste, 3, com cada uma das condições. Quando o valor do teste corresponde à condição, a ação é executada.

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

Neste exemplo simples, o valor é comparado a cada condição na lista, mesmo que haja uma correspondência para o valor 3. A instrução switch a seguir tem duas condições para um valor de 3. Ele demonstra que, por padrão, todas as condições são testadas.

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 direcionar o switch a parar de comparar após encontrar uma correspondência, use a instrução break. A instrução break encerra a instrução switch.

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.

Se o valor de teste for uma coleção, como uma matriz, cada item da coleção será avaliado na ordem em que ele aparece. Os exemplos a seguir avaliam 4 e, em seguida, 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.

Todas as instruções break se aplicam à coleção, não a cada valor, conforme mostrado no exemplo a seguir. A instrução switch é encerrada pela instrução break na condição do 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.

Neste exemplo, a instrução switch está testando o tipo do valor no hashtable. Você deve usar uma expressão que retorna um valor booleano para selecionar o bloco de script a ser executado.

$var = @{A = 10; B = 'abc'}

foreach ($key in $var.Keys) {
    switch ($var[$key].GetType()) {
        { $_ -eq [int32]  }  { "$key + 10 = $($var[$key] + 10)" }
        { $_ -eq [string] }  { "$key = $($var[$key])"           }
    }
}
A + 10 = 20
B = abc

Neste exemplo, um objeto que não é uma cadeia de caracteres ou dados numéricos é passado para o switch. O switch executa uma coerção de cadeia de caracteres no objeto e avalia o 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

Neste exemplo, não há nenhum caso de correspondência, portanto, não há saída.

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."}
}

Ao adicionar a cláusula default, você pode executar uma ação quando nenhuma outra condição seja atendida.

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 a palavra "quatorze" corresponda a um caso, você deve usar o parâmetro -Wildcard ou -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.

O exemplo a seguir usa o 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

O exemplo a seguir demonstra o uso de blocos de script como condições da instrução switch.

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

O exemplo a seguir processa uma matriz que contém dois valores de data. O <value-scriptblock> compara a propriedade Year de cada data. O <action-scriptblock> exibe uma mensagem de boas-vindas ou o número de dias até o início do ano de 2022.

switch ((Get-Date 1-Jan-2022), (Get-Date 25-Dec-2021)) {
    { $_.Year -eq 2021 } {
        $days = ((Get-Date 1/1/2022) - $_).days
        "There are $days days until 2022."
    }
    { $_.Year -eq 2022 } { 'Welcome to 2022!' }
}

Se o valor corresponder a várias condições, a ação para cada condição será executada. Para alterar esse comportamento, use as palavras-chave break ou continue.

A palavra-chave break encerra o processamento e sai da instrução switch.

A palavra-chave continue para de processar o valor atual, mas continua processando os valores subsequentes.

O exemplo a seguir processa uma matriz de números e exibe se eles são ímpares ou até mesmo. Números negativos são ignorados com a palavra-chave continue. Se um valor não numérico for encontrado, a execução será encerrada com a palavra-chave 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 também