Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Krátký popis
Vysvětluje, jak pomocí přepínače zpracovat více příkazů if.
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 příkaz switch. Příkaz switch je ekvivalentní řadě příkazů if, ale je jednodušší. Příkaz switch uvádí jednotlivé podmínky a volitelnou akci. Pokud je podmínka splněna, provede se akce.
Příkaz switch může používat automatické proměnné $_ a $switch. Viz about_Automatic_Variablespro více informací.
Syntaxe
Základní příkaz switch má následující formát:
Switch (<test-expression>)
{
<result1-to-be-matched> {<action>}
<result2-to-be-matched> {<action>}
}
Ekvivalentní příkazy if 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.
<result-to-be-matched> je výraz, jehož hodnota se porovnává se vstupní hodnotou. Výrazy zahrnují literální hodnoty (řetězce nebo čísla), proměnné a skriptovací bloky, 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é pochopit, že hodnota <result-to-be-matched> je na levé straně porovnávacího výrazu. To znamená, že výsledek <test-expression> je na pravé straně a může být převeden na typ hodnoty na levé straně pro porovnání. Další informace najdete v tématu about_Comparison_Operators
Hodnota default je vyhrazena pro akci, která se používá 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 příkazů <result-to-be-matched>.
Úplná syntaxe příkazu switch 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 se chová stejně jako použití parametru Exact. Provádí se porovnání hodnoty bez rozlišení velkých a malých písmen. 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 příkazu default je povolena pouze jedna klauzule switch.
switch má následující parametry:
- zástupný znak – označuje, že podmínka je řetězec se zástupnými znaky. Pokud klauzule match není řetězec, parametr se ignoruje. Porovnání není citlivé na rozdíly mezi malými a velkými písmeny.
- 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í není citlivé na rozdíly mezi malými a velkými písmeny.
- Rozlišují 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, nikoliv z
<test-expression>. Pokud je součástí více parametrů File, použije se jenom poslední. Každý řádek souboru se přečte a vyhodnotí příkazemswitch. Porovnání není citlivé na rozdíly mezi malými a velkými písmeny. -
regex – provádí porovnávání regulárních výrazů hodnoty s podmínkou. Pokud klauzule match není řetězec, bude tento parametr ignorován.
Porovnání není citlivé na rozdíly mezi malými a velkými písmeny.
$matchesautomatická 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, například Regex a Wildcard, má přednost poslední zadaný parametr a všechny konfliktní parametry se ignorují. Je také povoleno více instancí parametrů. Použije se ale pouze poslední uvedený parametr.
Příklady
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 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í příkaz switch 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.
Chcete-li nasměrovat switch, aby po shodě přestal provádět porovnání, použijte příkaz break. Příkaz break ukončí příkaz 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.
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 příkazy break 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 příkaz switch testuje typ hodnoty v hashtable. Je nutné použít výraz, který vrátí logickou hodnotu, pro výběr bloku 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 neřetězcový ani číselný objekt předává do switch.
switch provede u objektu převod na řetězec 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."}
}
Přidáním klauzule default 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 slovo "čtrnáct" odpovídalo případu, musíte použít parametr -Wildcard nebo -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.
Následující příklad používá parametr -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
Následující příklad ukazuje použití bloků skriptu jako podmínek příkazů switch.
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.
<value-scriptblock> porovnává u každého data vlastnost Rok.
<action-scriptblock> zobrazí 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. Pokud chcete toto chování změnit, použijte klíčová slova break nebo continue.
Klíčové slovo break zastaví zpracování a ukončí příkaz switch.
Klíčové slovo continue přestane zpracovávat aktuální hodnotu, ale nadále zpracovává všechny následné hodnoty.
Následující příklad zpracuje pole čísel a zobrazí, jestli jsou lichá nebo sudá. Záporná čísla se přeskočí pomocí klíčového slova continue. Pokud narazí na nečíselnou hodnotu, exekuce se ukončí pomocí klíčového slova 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