Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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 azswitchutasí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
$Matchesautomatikus 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