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říkazemswitch
. 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