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


az _Switchről

Rövid leírás

Ez a cikk azt ismerteti, hogyan használható kapcsoló több feltételes utasítás kezelésére.

Hosszú leírás

Ha egy feltételt egy szkriptben vagy függvényben szeretne ellenőrizni, használhat utasítást if . A 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álhat utasítást switch . Az switch utasítás hasonló az utasítások sorozatához if , de egyszerűbb. Az switch utasítás felsorolja az egyes feltételeket és a megfelelő műveletet. Ha egy feltétel egyezik, a művelet végrehajtása történik.

Fontos

Az switch utasítás az összes értéket sztringekké alakítja az összehasonlítás előtt.

Szemantika

Az alapszintű switch utasítás formátuma a következő:

switch (<test-expression>) {
    <result1-to-be-matched> {<action-statement>}
    <result2-to-be-matched> {<action-statement>}
}

Az utasítás szintaxisa switch az alábbi if utasításokhoz hasonló:

if ("$(<result1-to-be-matched>)") -eq ("$(<test-expression>)") {<action>}
if ("$(<result2-to-be-matched>)") -eq ("$(<test-expression>)") {<action>}

A kifejezések közé tartoznak a literális értékek (sztringek vagy számok), változók és logikai értéket visszaadó szkriptblokkok. Az switch utasítás az összes értéket sztringekké alakítja az összehasonlítás előtt. Példa: A sztringek konvertálásának hatása a jelen cikk későbbi részében.

A <test-expression> kiértékelés kifejezés módban történik. Ha a kifejezés egynél több értéket, például tömböt vagy más számbavételi típust ad vissza, az utasítás külön értékeli ki az switch egyes számbavételi értékeket.

A <result-to-be-matched> kifejezésnek egyetlen értékre kell feloldania. Ezt az értéket összehasonlítjuk a bemeneti értékkel.

A default érték a művelethez van fenntartva, ha nincsenek más egyezések.

A switch utasítás használhatja a $_ és $switch automatikus változókat. 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ő. További információ: about_Automatic_Variables.

A teljes switch utasítás szintaxisa a következő:

switch [-Regex | -Wildcard | -Exact] [-CaseSensitive] (<test-expression>) {
    string | number | variable | { <value-scriptblock> }
        { <action-statement> }
    default { <action-statement> } # optional
}

vagy

switch [-Regex | -Wildcard | -Exact] [-CaseSensitive] -File filename {
    string | number | variable | { <value-scriptblock> }
        { <action-statement> }
    default { <action-statement> }  # optional
}

Ha nem használ paramétereket, switch ugyanúgy viselkedik, mint a 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.

A 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 egy else utasítás if záradékának felel meg. Minden default utasításban csak egy switch záradék engedélyezett.

switch a következő paraméterekkel rendelkezik:

  • helyettesítő karakterek – Azt jelzi, hogy a feltétel 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é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ő.
  • CaseSensitive – Megkülönbözteti a kis- és nagybetűket. Ha az egyezés záradék nem sztring, a paraméter figyelmen kívül lesz hagyva.
  • Fájl – Nem <test-expression>, hanem fájlból veszi a bemenetet. A fájl egyszerre olvas egy sort, és az switch utasítás kiértékeli. Alapértelmezés szerint az összehasonlítás kis- és nagybetűket nem érzékenyítő. A Fájl paraméter csak egy fájlt támogat. Ha több Fájl paraméter is szerepel a fájlban, csak az utolsót használja a rendszer. További információt a Fájl paraméter példáiban talál.
  • Regex – Az értéknek a feltételhez való normál megfeleltetésének végrehajtása. 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ő. Az $Matches automatikus változó az egyező utasításblokkon belül használható.

Jegyzet

Ütköző értékek ( például Regex és helyettesítő karakterek) 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ák az utasítás használatát switch mutatják be.

Példák egyszerű egyezésre

Az alábbi példában a 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's one."   }
    2 { "It's two."   }
    3 { "It's three." }
    4 { "It's four."  }
}
It's three.

Ebben a példában az érték a lista minden feltételével összehasonlítva lesz. Az alábbi switch utasítás két feltételt biztosít a 3 értékhez, ami azt mutatja, hogy minden feltételt tesztelnek.

switch (3) {
    1 { "It's one."    }
    2 { "It's two."    }
    3 { "It's three."  }
    4 { "It's four."   }
    3 { "Three again." }
}
It's three.
Three again.

A folyamat használata break és continue szabályozása

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 break vagy continue kulcsszavakat.

A break kulcsszó leállítja a feldolgozást, és kilép a switch utasításból.

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 páratlanok vagy párosak. A rendszer kihagyja a negatív számokat a continue kulcsszóval. Ha nem számmal találkozik, a végrehajtás a break kulcsszóval 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

A sztringátalakítás hatása

Az összes érték, mind a bemenet, mind az összehasonlító érték sztringekké lesz konvertálva összehasonlítás céljából. A nem kívánt sztringátalakítás elkerülése érdekében szkriptblokkokkal értékelje ki a kapcsoló értékét.

switch ( ([datetime]'1 Jan 1970').DayOfWeek ) {
    4            { 'The integer value matches a Thursday.' }
    "4"          { 'The numeric string matches a Thursday.' }
    "Thursday"   { 'The string value matches a Thursday.' }
    { 4 -eq $_ } { 'The expression matches a Thursday.' }
}

A dátumobjektum DayOfWeek tulajdonsága enumerálás. Bár az enumerálások összehasonlíthatók a numerikus vagy sztringértékekkel, az switch utasítás az értéket az enumerálás sztring-ábrázolására konvertálja.

The string value matches a Thursday.
The expression matches a Thursday.

Ez a viselkedés eltér az egy utasításban szereplő -eq összehasonlítás viselkedésétőlif.

if (4 -eq ([datetime]'1 Jan 1970').DayOfWeek) {
    'The integer value matches a Thursday.'
}
The value matches a Thursday.

Ebben a példában a rendszer egy kivonatolót ad át az switch utasításnak. A switch kivonatolót sztringgé alakítja.

$test = @{
    Test  = 'test'
    Test2 = 'test2'
}

$test.ToString()
System.Collections.Hashtable

Figyelje meg, hogy a kivonatoló sztring-ábrázolása nem azonos a tesztkulcs értékével.

switch -Exact ($test) {
    'System.Collections.Hashtable' { 'Hashtable string coercion' }
    'test'                         { 'Hashtable value' }
}
Hashtable string coercion

A switch kivonatoló értékeinek tesztelése

Ebben a példában a switch utasítás a kivonatolóban lévő érték típusának tesztelése. Az értékek tesztelése előtt számba kell venni a kivonatoló elemeit. A sztringátalakítás bonyodalmainak elkerülése érdekében használjon egy szkriptblokkot, amely logikai értéket ad vissza a végrehajtandó műveletutasítás kiválasztásához.

$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

Helyettesítő karakterek használata switch

Ebben a példában nincs egyező eset, így nincs kimenet.

switch ("fourteen") {
    1     { "It's one.";   break }
    2     { "It's two.";   break }
    3     { "It's three."; break }
    4     { "It's four.";  break }
    "fo*" { "That's too many."   }
}

A default záradék hozzáadásával műveletet hajthat végre, ha más feltételek nem teljesülnek.

switch ("fourteen") {
    1       { "It's one.";   break }
    2       { "It's two.";   break }
    3       { "It's three."; break }
    4       { "It's four.";  break }
    "fo*"   { "That's too many."   }
    default { "No matches"         }
}
No matches

Ahhoz, hogy a fourteen szó egyező legyen egy esettel, a -Wildcard vagy -Regex paramétert kell használnia.

switch -Wildcard ("fourteen") {
    1     { "It's one.";   break }
    2     { "It's two.";   break }
    3     { "It's three."; break }
    4     { "It's four.";  break }
    "fo*" { "That's too many."   }
}
That's too many.

Reguláris kifejezések használata switch

Az alábbi példa a -Regex paramétert 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. A <value-scriptblock> az egyes dátumok Year tulajdonságát hasonlítja össze. A <action-statement> egy üdvözlő üzenetet vagy a napok számát jeleníti meg 2022 elejéig.

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!' }
}

Fájl tartalmának olvasása a következővel: switch

A switch utasítás és a Fájl paraméter hatékony módja a nagy fájlok soronkénti feldolgozásának. A PowerShell a fájl sorait a switch utasításba streameli. Minden sor feldolgozása egyenként történik.

A műveletutasításban szereplő break kulcsszóval a fájl végére érve megszakíthatja a feldolgozást. A switch utasítás hatékonyabb, mint a Get-Content használata a nagy méretű fájlok soronkénti feldolgozásához.

A switch -File kombinálhatja -Wildcard vagy -Regex a rugalmas és hatékony vonalenkénti mintaegyezés érdekében.

Az alábbi példa beolvassa a README.md az PowerShell-Docs adattárban. Az egyes sorokat addig kimeneteli, amíg el nem éri a ##.

switch -Regex -File .\README.md {
    '^##\s' { break }
    default { $_; continue }
}

Az <filename> argumentum helyettesítő karaktereket fogad el, de csak egy fájlnak kell egyeznie. Az alábbi példa ugyanaz, mint az előző, kivéve, hogy helyettesítő karaktert használ a <filename> argumentumban. Ez a példa azért működik, mert a helyettesítő karakterminta csak egy fájlnak felel meg.

switch -Regex -File .\README.* {
    '^##\s' { break }
    default { $_; continue }
}

Olyan karaktereket kell feloldania, amelyek helyettesítő karakterekként értelmezhetők, ha azt szeretné, hogy literálként kezeljék őket.

$file = (New-Item -Path 'Temp:\Foo[0]' -Value Foo -Force).FullName
switch -File $file { Foo { 'Foo' } }
# No files matching '...\Temp\Foo[0]' were found.

$fileEscaped = [WildcardPattern]::Escape($file)
switch -File $fileEscaped { foo { 'Foo' } }
# Foo

Lásd még