Megosztás a következőn keresztül:


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ékeli switch . 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

Lásd még