Sdílet prostřednictvím


about_Switch

Krátký popis

Vysvětluje, jak použít přepínač pro zpracování více if příkazů.

Dlouhý popis

Pokud chcete zkontrolovat podmínku ve skriptu nebo funkci, použijte příkaz if . Příkaz if může kontrolovat mnoho typů podmínek, včetně hodnoty proměnných a vlastností objektů.

Pokud chcete zkontrolovat více podmínek, použijte switch příkaz. Příkaz switch je ekvivalentní řadě příkazů if, ale je jednodušší. Příkaz switch uvádí každou podmínku a volitelnou akci. Pokud podmínka získá, provede se akce.

Příkaz switch může používat $_ proměnné a $switch automatické proměnné. Další informace najdete v tématu about_Automatic_Variables.

Syntaxe

Základní switch příkaz má následující formát:

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

Ekvivalentní if příkazy jsou:

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

<test-expression> je jeden výraz, který se vyhodnocuje v režimu výrazu, aby vrátil hodnotu.

Jedná se <result-to-be-matched> o výraz, jehož hodnota je porovnána se vstupní hodnotou. Výrazy zahrnují hodnoty literálů (řetězce nebo čísla), proměnné a bloky skriptu, které vracejí logickou hodnotu.

Jakákoli necitovaná hodnota, která není rozpoznána jako číslo, se považuje za řetězec. Abyste se vyhnuli nejasnostem nebo neúmyslnému převodu řetězců, měli byste vždy uvozovat řetězcové hodnoty. Uzavřete všechny výrazy do závorek (), vytváření dílčích výrazů, aby se zajistilo správné vyhodnocení výrazu.

Je důležité si uvědomit, že hodnota <result-to-be-matched> je na levé straně výrazu porovnání. To znamená, že výsledek <test-expression> je na pravé straně, který lze pro porovnání převést na typ hodnoty na levé straně. Další informace najdete v tématu about_Comparison_Operators

Hodnota default je vyhrazena pro akci použitou v případě, že neexistují žádné jiné shody.

Automatická $_ proměnná obsahuje hodnotu výrazu předaného příkazu switch a je k dispozici pro vyhodnocení a použití v rámci rozsahu <result-to-be-matched> příkazů.

Úplná switch syntaxe příkazu je následující:

switch [-Regex | -Wildcard | -Exact] [-CaseSensitive] (<test-expression>) {
    string | number | variable | { <value-scriptblock> }
        { <action-scriptblock> }
    default { <action-scriptblock> } # optional
}

nebo

switch [-Regex | -Wildcard | -Exact] [-CaseSensitive] -File filename {
    string | number | variable | { <value-scriptblock> }
        { <action-scriptblock> }
    default { <action-scriptblock> }  # optional
}

Pokud nepoužíváte parametry, switch se chová stejně jako použití parametru Exact. Pro hodnotu se provádí shoda nerozlišující malá a velká písmena. Pokud je hodnota kolekce, každý prvek se vyhodnotí v pořadí, ve kterém se zobrazí.

Příkaz switch musí obsahovat alespoň jeden příkaz podmínky.

Klauzule default se aktivuje, když hodnota neodpovídá žádné z podmínek. Je ekvivalentní klauzuli else v příkazu if. V každém default příkazu je povolená pouze jedna switch klauzule.

switch má následující parametry:

  • Zástupný znak – označuje, že podmínka je řetězec se zástupným znakem. Pokud klauzule match není řetězec, parametr se ignoruje. Porovnání nerozlišuje malá a velká písmena.
  • Přesná – označuje, že klauzule shody, pokud se jedná o řetězec, musí přesně odpovídat. Pokud klauzule match není řetězec, bude tento parametr ignorován. Porovnání nerozlišuje malá a velká písmena.
  • Malá a velká písmena – provede shodu s rozlišováním velkých a malých písmen. Pokud klauzule match není řetězec, bude tento parametr ignorován.
  • soubor – přebírá vstup ze souboru místo <test-expression>. Soubor načte řádek najednou a vyhodnotí se příkazem switch. Ve výchozím nastavení porovnání nerozlišuje malá a velká písmena. Parametr File podporuje pouze jeden soubor. Pokud je součástí více parametrů souboru , použije se pouze poslední. Další informace naleznete v tématu Příklady parametrů souboru.
  • Regulární výraz – provede porovnávání regulárního výrazu hodnoty s podmínkou. Pokud klauzule match není řetězec, bude tento parametr ignorován. Porovnání nerozlišuje malá a velká písmena. Automatická $Matches proměnná je k dispozici pro použití v rámci odpovídajícího bloku příkazu.

Poznámka:

Při zadávání konfliktních hodnot, jako je Regex a Wildcard, má poslední zadaný parametr přednost a všechny konfliktní parametry jsou ignorovány. Je také povoleno více instancí parametrů. Použije se ale pouze poslední uvedený parametr.

Jednoduché příklady shody

V následujícím příkladu příkaz switch porovnává testovací hodnotu 3 s každou z podmínek. Když testovací hodnota odpovídá podmínce, provede se akce.

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

V tomto příkladu se hodnota porovná s každou podmínkou v seznamu. Následující příkaz switch má dvě podmínky pro hodnotu 3, která ukazuje, že jsou testovány všechny podmínky.

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

Pokud chcete nasměrovat switch , aby se po shodě přestal porovnávat, použijte příkaz break . Příkaz break ukončí switch příkaz.

switch (3) {
    1 { "It's one."           }
    2 { "It's two."           }
    3 { "It's three."; break  }
    4 { "It's four."          }
    3 { "Three again."        }
}
It's three.

Pokud je testovací hodnotou kolekce, například matice, vyhodnocuje se každá položka v kolekci v pořadí, ve kterém se zobrazí. Následující příklady vyhodnotí hodnotu 4 a 2.

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

Všechny break příkazy se vztahují na kolekci, ne na každou hodnotu, jak je znázorněno v následujícím příkladu. Příkaz switch je ukončen příkazem break v podmínce hodnoty 4.

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

Složitější příklady shody

V tomto příkladu switch příkaz testuje typ hodnoty v hashtable. Je nutné použít a výraz, který vrátí logickou hodnotu pro výběr skriptu, který se má provést.

$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

V tomto příkladu se objekt, který není řetězcem nebo číselnými daty, předává do objektu switch. Provede switch pro objekt převod řetězce a vyhodnotí výsledek.

$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

V tomto příkladu neexistuje žádný odpovídající případ, takže neexistuje žádný výstup.

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

default Přidáním klauzule můžete provést akci, pokud žádné jiné podmínky nebudou úspěšné.

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

Aby se slovo fourteen shodovaly s případem, musíte použít parametr -Wildcard nebo -Regex.

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

Následující příklad používá -Regex parametr.

$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

Následující příklad ukazuje použití bloků skriptu jako switch podmínky příkazu.

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

Následující příklad zpracuje pole obsahující dvě hodnoty kalendářních dat. Porovná <value-scriptblock> vlastnost Year každého data. Zobrazí <action-scriptblock> uvítací zprávu nebo počet dní do začátku roku 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!' }
}

Pokud hodnota odpovídá více podmínkám, provede se akce pro každou podmínku. Chcete-li toto chování změnit, použijte break klíčová slova.continue

Klíčové break slovo zastaví zpracování a ukončí switch příkaz.

Klíčové continue slovo přestane zpracovávat aktuální hodnotu, ale nadále zpracovává všechny následné hodnoty.

Následující příklad zpracuje matici čísel a zobrazí, jestli jsou liché nebo sudé. Záporná čísla se přeskočí klíčovým slovem continue . Pokud dojde k nečíslu, spuštění se ukončí pomocí klíčového break slova.

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

Příklady parametrů souboru

Použití příkazu switch s parametrem File představuje efektivní způsob zpracování velkých souborů po řádku. PowerShell streamuje řádky souboru do příkazu switch. Každý řádek se zpracovává jednotlivě.

Zpracování můžete ukončit před dosažením konce souboru pomocí klíčového slova break v příkazu akce. Příkaz switch je efektivnější než použití Get-Content ke zpracování velkých souborů po řádku.

switch -File můžete kombinovat s -Wildcard nebo -Regex pro flexibilní a efektivní porovnávání vzorů po řádech.

Následující příklad přečte README.md v úložišti PowerShell-Docs. Vypíše každý řádek, dokud nedosáhne řádku, který začíná ##.

switch -Regex -File .\README.md {
    '^##\s' { break }
    default { $_; continue }
}

Argument <filename> se interpretuje jako výraz se zástupným znakem, ale musí odpovídat pouze jednomu souboru. Následující příklad je stejný jako předchozí s tím rozdílem, že používá zástupný znak v argumentu <filename>. Tento příklad funguje, protože vzor zástupných znaků odpovídá pouze jednomu souboru.

switch -Regex -File .\README.* {
    '^##\s' { break }
    default { $_; continue }
}

Pokud chcete, aby se s nimi zacházelo jako s literály, musíte řídicí znaky, které lze interpretovat jako zástupné znaky.

$file = (New-Item -Path 'Temp:\Foo[0]' -Value Foo -Force).FullName
switch -File $file { Foo { 'Foo' } }
# No files matching '...\Temp\Foo[0]' were found.

$fileEscaped = [WildcardPattern]::Escape($file)
switch -File $fileEscaped { foo { 'Foo' } }
# Foo

Viz také