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ě if příkazů, 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>}

Jedná se o <test-expression> jeden výraz, který se vyhodnotí 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 <result-to-be-matched> hodnota je na levé straně srovnávacího výrazu. 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 se nepoužívají žádné parametry, switch chová se 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 if příkazu. V každém switch příkazu je povolená pouze jedna default 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 match, 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.
  • File - Přebírá vstup ze souboru místo <test-expression>. Pokud je součástí více parametrů souboru , použije se pouze poslední. Každý řádek souboru se přečte a vyhodnotí příkazem switch . Porovnání nerozlišuje malá a velká písmena.
  • 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.

Příklady

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

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

V tomto jednoduchém příkladu se hodnota porovná s každou podmínkou v seznamu, i když existuje shoda pro hodnotu 3. Následující switch příkaz má dvě podmínky pro hodnotu 3. Ukazuje, že ve výchozím nastavení se testují všechny podmínky.

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.

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 is one."}
    2 {"It is two."}
    3 {"It is three."; Break}
    4 {"It is four."}
    3 {"Three again."}
}
It is 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 is one." }
    2 {"It is two." }
    3 {"It is three." }
    4 {"It is four." }
    3 {"Three again."}
}
It is four.
It is 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 is one."; Break}
    2 {"It is two." ; Break }
    3 {"It is three." ; Break }
    4 {"It is four." ; Break }
    3 {"Three again."}
}
It is four.

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 is one."; Break}
    2 {"It is two."; Break}
    3 {"It is three."; Break}
    4 {"It is 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 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

Aby se slovo "čtrnáct" shodovaly s případem, musíte použít -Wildcard parametr nebo -Regex parametr.

   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.

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

Viz také