about_Switch
Rövid leírás
Ez a cikk azt ismerteti, hogyan használható kapcsoló több if
utasítás kezelésére.
Hosszú leírás
Ha egy feltételt egy szkriptben vagy függvényben szeretne ellenőrizni, használjon utasítást if
. Az if
utasítás számos feltételtípust képes ellenőrizni, beleértve a változók értékét és az objektumok tulajdonságait.
Több feltétel ellenőrzéséhez használjon utasítást switch
. Az switch
utasítás egyenértékű egy if
sor utasítással, de egyszerűbb. Az switch
utasítás felsorolja az egyes feltételeket és egy választható műveletet. Ha egy feltétel beolvas, a művelet végrehajtása történik.
Az switch
utasítás használhatja az és $switch
az $_
automatikus változókat. További információ: about_Automatic_Variables.
Syntax
Egy alapszintű switch
utasítás formátuma a következő:
Switch (<test-expression>)
{
<result1-to-be-matched> {<action>}
<result2-to-be-matched> {<action>}
}
Az egyenértékű if
utasítások a következők:
if (<result1-to-be-matched> -eq (<test-expression>)) {<action>}
if (<result2-to-be-matched> -eq (<test-expression>)) {<action>}
A <test-expression>
kifejezés módban kiértékelt egyetlen kifejezés, amely értéket ad vissza.
Ez <result-to-be-matched>
egy kifejezés, amelynek értéke a bemeneti értékkel van összehasonlítva. A kifejezések közé tartoznak a literális értékek (sztringek vagy számok), változók és logikai értéket visszaadó szkriptblokkok.
A számként nem felismert nem számértékek sztringként lesznek kezelve.
A keveredés vagy a nem kívánt sztringátalakítás elkerülése érdekében mindig sztringértékeket kell idéznie. Csatolja a kifejezéseket zárójelekbe ()
, alkifejezéseket hoz létre, hogy a kifejezés helyes kiértékelése biztosítva legyen.
Fontos tisztában lenni azzal, hogy az <result-to-be-matched>
érték az összehasonlító kifejezés bal oldalán található. Ez azt jelenti, hogy az <test-expression>
eredmény a jobb oldalon van, amely a bal oldali érték típusára konvertálható összehasonlítás céljából. További információ: about_Comparison_Operators
Az érték default
a használt művelethez van fenntartva, ha nincsenek más egyezések.
Az $_
automatikus változó az utasításnak switch
átadott kifejezés értékét tartalmazza, és az utasítások hatókörén <result-to-be-matched>
belül használható és kiértékelhető.
A teljes switch
utasítás szintaxisa a következő:
switch [-regex | -wildcard | -exact] [-casesensitive] (<test-expression>)
{
"string" | number | variable | { <value-scriptblock> } { <action-scriptblock> }
default { <action-scriptblock> } # optional
}
vagy
switch [-regex | -wildcard | -exact] [-casesensitive] -file filename
{
"string" | number | variable | { <value-scriptblock> } { <action-scriptblock> }
default { <action-scriptblock> } # optional
}
Ha nem használ paramétereket, ugyanúgy viselkedik, switch
mint az Exact paraméter használata. Kis- és nagybetűket nem érzékelyítő egyezést hajt végre az értékhez. Ha az érték gyűjtemény, minden elem kiértékelése a megjelenítési sorrendben történik.
Az switch
utasításnak tartalmaznia kell legalább egy feltételutasítást.
A default
záradék akkor aktiválódik, ha az érték nem felel meg egyik feltételnek sem. Ez egyenértékű egy else
utasításban szereplő záradékkal if
. Minden switch
utasításban csak egy default
záradék engedélyezett.
switch
a következő paraméterekkel rendelkezik:
- Helyettesítő karakter – Azt jelzi, hogy a feltétel egy helyettesítő karaktersorozat. Ha az egyezési záradék nem sztring, a paraméter figyelmen kívül lesz hagyva. Az összehasonlítás kis- és nagybetűket nem érzékelyítő.
- Pontos – Azt jelzi, hogy az egyezés záradéknak , ha sztringről van szó, pontosan egyeznie kell. Ha az egyezés záradék nem sztring, a paraméter figyelmen kívül lesz hagyva. Az összehasonlítás kis- és nagybetűket nem érzékelyítő.
- CaseSensitive – Kis- és nagybetűket megkülönböztető egyezést hajt végre. Ha az egyezés záradék nem sztring, a paraméter figyelmen kívül lesz hagyva.
- Fájl – Nem fájlból, hanem fájlból veszi a bemenetet
<test-expression>
. Ha több fájlparaméter is szerepel a fájlban, csak az utolsót használja a rendszer. A fájl minden sorát az utasítás felolvassa és kiértékeliswitch
. Az összehasonlítás kis- és nagybetűket nem érzékelyítő. - Regex – Az értéknek a feltételhez való normál megfeleltetésének végrehajtása. Ha az egyezés záradék nem sztring, a paraméter figyelmen kívül lesz hagyva.
Az összehasonlítás kis- és nagybetűket nem érzékelyítő. Az
$matches
automatikus változó az egyező utasításblokkban használható.
Feljegyzés
Ütköző értékek (például Regex és Helyettesítő karakter) megadásakor az utolsó megadott paraméter elsőbbséget élvez, és a rendszer figyelmen kívül hagyja az összes ütköző paramétert. Több paraméterpéldány is engedélyezett. A rendszer azonban csak az utolsó felsorolt paramétert használja.
Példák
Az alábbi példában az switch
utasítás összehasonlítja a 3 tesztértéket az egyes feltételekkel. Ha a teszt értéke megegyezik a feltétellel, a művelet végrehajtása történik.
switch (3)
{
1 {"It is one."}
2 {"It is two."}
3 {"It is three."}
4 {"It is four."}
}
It is three.
Ebben az egyszerű példában az érték a listában szereplő összes feltételhez viszonyítva jelenik meg, annak ellenére, hogy a 3 értéknek van egyezése. Az alábbi switch
utasítás két feltételt biztosít a 3 értékhez. Ez azt mutatja be, hogy alapértelmezés szerint minden feltételt tesztelnek.
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.
switch
Az egyezés utáni összehasonlítás leállításához használja az utasítástbreak
. Az break
utasítás leállítja az utasítást 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.
Ha a tesztérték gyűjtemény, például tömb, a rendszer a gyűjtemény minden elemét abban a sorrendben értékeli ki, amelyben az megjelenik. Az alábbi példák 4, majd 2 értéket értékelnek ki.
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.
Az break
utasítások a gyűjteményre vonatkoznak, nem az egyes értékekre, ahogy az az alábbi példában látható. Az switch
utasítást a break
4. érték állapotában lévő utasítás szakítja meg.
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.
Ebben a példában az utasítás a switch
kivonatolóban lévő érték típusának tesztelése. A végrehajtandó szkriptblokk kiválasztásához logikai értéket ad vissza, és kifejezéssel kell rendelkeznie.
$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
Ebben a példában a nem sztring- vagy numerikus adatokat tartalmazó objektumot adjuk át a switch
. A switch
függvény sztring-kényszerítést hajt végre az objektumon, és kiértékeli az eredményt.
$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
Ebben a példában nincs egyező eset, így nincs kimenet.
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."}
}
A záradék hozzáadásával default
műveletet hajthat végre, ha más feltételek nem teljesülnek.
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
Ahhoz, hogy a "tizennéni" szó megegyezzen egy esettel, a vagy -Regex
paramétert -Wildcard
kell használnia.
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.
Az alábbi példa a paramétert -Regex
használja.
$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
Az alábbi példa a szkriptblokkok utasításfeltételként switch
való használatát mutatja be.
switch ("Test")
{
{$_ -is [String]} {
"Found a string"
}
"Test" {
"This $_ executes as well"
}
}
Found a string
This Test executes as well
Az alábbi példa egy két dátumértéket tartalmazó tömböt dolgoz fel. Az <value-scriptblock>
egyes dátumok Year tulajdonságát hasonlítja össze. Ekkor <action-scriptblock>
megjelenik egy üdvözlő üzenet, vagy a 2022-es év elejéig tartó napok száma.
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!' }
}
Ha az érték több feltételnek felel meg, a rendszer végrehajtja az egyes feltételekhez tartozó műveletet. A viselkedés módosításához használja a kulcsszavakat vagy continue
a break
kulcsszavakat.
A break
kulcsszó leállítja a feldolgozást, és kilép az utasításból switch
.
A continue
kulcsszó leállítja az aktuális érték feldolgozását, de folytatja a további értékek feldolgozását.
Az alábbi példa egy számtömböt dolgoz fel, és megjeleníti, ha azok páratlanok vagy párosak. A program kihagyja a negatív számokat a continue
kulcsszóval. Ha nem számmal találkozik, a végrehajtás a kulcsszóval break
fejeződik be.
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