Compartilhar via


about_Switch

Descrição breve

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

Descrição longa

Para verificar uma condição em um script ou função, use uma if instrução. A if instrução 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 switch instrução. A switch declaração é equivalente a uma série de if declarações, mas é mais simples. A switch instrução lista cada condição e uma ação opcional. Se uma condição for obtida, a ação será executada.

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

Sintaxe

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

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

As declarações equivalentes if são:

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

A <test-expression> é uma expressão única que é 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 blocos de script que retornam um valor booliano.

Qualquer valor sem aspas 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 colocar 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 <result-to-be-matched> valor está no lado esquerdo da expressão de comparação. Isso significa que o resultado do <test-expression> está no lado direito, que pode ser convertido para o 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 usada quando não há outras correspondências.

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

A sintaxe completa switch da instrução é 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, switch se comporta da mesma forma que usar o parâmetro Exato . 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 aparece.

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

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

switch tem os seguintes parâmetros:

  • Curinga - Indica que a condição é uma cadeia de caracteres curinga. Se a cláusula match não for uma string, o parâmetro será ignorado. A comparação não diferencia maiúsculas de minúsculas.
  • Exato - Indica que a cláusula match, se for uma string, deve corresponder exatamente. Se a cláusula match não for uma string, 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 string, esse parâmetro será ignorado.
  • Arquivo- Recebe a entrada de um arquivo em vez de um <test-expression>arquivo . Se vários parâmetros File forem incluídos, somente o último será usado. Cada linha do arquivo é lida e avaliada switch pela instrução. A comparação não diferencia maiúsculas de minúsculas.
  • Regex - Executa a correspondência de expressão regular do valor para a condição. Se a cláusula match não for uma string, esse parâmetro será ignorado. A comparação não diferencia maiúsculas de minúsculas. A $matches variável automática está disponível para uso dentro do 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, apenas o último parâmetro listado é usado.

Exemplos

No exemplo a seguir, a switch instrução compara o valor de teste, 3, com cada uma das condições. Quando o valor de 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 a seguir switch 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 para parar de comparar após uma correspondência, use a break instrução. A break instrução encerra a switch instrução.

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 aparece. Os exemplos a seguir avaliam 4 e depois 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 break instruções se aplicam à coleção, não a cada valor, conforme mostrado no exemplo a seguir. A switch instrução é terminada pela break instrução na condição de 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 switch instrução está testando o tipo do valor na tabela de hash. Você deve usar uma expressão que retorne um valor booleano para selecionar o scriptblock 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á maiúsculas e minúsculas correspondentes, 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 default cláusula, você pode executar uma ação quando nenhuma outra condição for bem-sucedida.

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 -Wildcard parâmetro or -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 -Regex parâmetro.

$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 switch condições de instrução.

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 exibe <action-scriptblock> 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 break palavras-chave ou continue .

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

A continue palavra-chave interrompe o processamento do valor atual, mas continua processando todos os valores subsequentes.

O exemplo a seguir processa uma matriz de números e exibe se eles são pares ou ímpares. Números negativos são ignorados com a continue palavra-chave. Se um não número for encontrado, a execução será encerrada com a break palavra-chave.

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

Confira também