about_Switch
Kort beskrivning
Förklarar hur du använder en växel för att hantera flera if
instruktioner.
Lång beskrivning
Om du vill kontrollera ett villkor i ett skript eller en funktion använder du en if
-instruktion. Instruktionen if
kan kontrollera många typer av villkor, inklusive värdet för variabler och objektens egenskaper.
Om du vill kontrollera flera villkor använder du en switch
instruktion.
switch
-instruktionen motsvarar en serie if
-instruktioner, men det är enklare. Instruktionen switch
visar varje villkor och en valfri åtgärd. Om ett villkor erhålls utförs åtgärden.
Instruktionen switch
kan använda och $_
$switch
automatiska variabler. Mer information finns i about_Automatic_Variables.
Syntax
En grundläggande switch
instruktion har följande format:
switch (<test-expression>)
{
<result1-to-be-matched> {<action>}
<result2-to-be-matched> {<action>}
}
Motsvarande if
instruktioner är:
if (<result1-to-be-matched> -eq (<test-expression>)) {<action>}
if (<result2-to-be-matched> -eq (<test-expression>)) {<action>}
<test-expression>
är ett enda uttryck som utvärderas i uttrycksläge för att returnera ett värde.
<result-to-be-matched>
är ett uttryck vars värde jämförs med indatavärdet. Uttryck inkluderar literalvärden (strängar eller tal), variabler och skriptblock som returnerar ett booleskt värde.
Alla ociterade värden som inte känns igen som ett tal behandlas som en sträng.
För att undvika förvirring eller oavsiktlig strängkonvertering bör du alltid citera strängvärden. Omslut alla uttryck inom parenteser ()
, vilket skapar underuttryck, för att säkerställa att uttrycket utvärderas korrekt.
Det är viktigt att förstå att värdet <result-to-be-matched>
finns till vänster i jämförelseuttrycket. Det innebär att resultatet av <test-expression>
är på höger sida, som kan konverteras till typen av det vänstra sidovärdet för jämförelse. Mer information finns i about_Comparison_Operators
Värdet default
är reserverat för den åtgärd som används när det inte finns några andra matchningar.
Den $_
automatiska variabeln innehåller värdet för uttrycket som skickas till -instruktionen switch
och är tillgänglig för utvärdering och användning inom omfånget för -uttrycken <result-to-be-matched>
.
Den fullständiga switch
instruktionssyntaxen är följande:
switch [-Regex | -Wildcard | -Exact] [-CaseSensitive] (<test-expression>) {
string | number | variable | { <value-scriptblock> }
{ <action-scriptblock> }
default { <action-scriptblock> } # optional
}
eller
switch [-Regex | -Wildcard | -Exact] [-CaseSensitive] -File filename {
string | number | variable | { <value-scriptblock> }
{ <action-scriptblock> }
default { <action-scriptblock> } # optional
}
Om du inte använder parametrar fungerar switch
på samma sätt som med parametern Exact. Den utför en skiftlägeskänslig matchning för värdet. Om värdet är en samling utvärderas varje element i den ordning det visas.
-instruktionen switch
måste innehålla minst en villkorsuttryck.
Satsen default
utlöses när värdet inte matchar något av villkoren. Det motsvarar en else
-sats i en if
-instruktion. Endast en default
sats tillåts i varje switch
-instruktion.
switch
har följande parametrar:
- Jokertecken – anger att villkoret är en jokerteckensträng. Om matchningssatsen inte är en sträng ignoreras parametern. Jämförelsen är skiftlägeskänslig.
- Exact – Anger att matchningssatsen, om det är en sträng, måste matcha exakt. Om matchningssatsen inte är en sträng ignoreras den här parametern. Jämförelsen är skiftlägeskänslig.
- CaseSensitive – Utför en skiftlägeskänslig matchning. Om matchningssatsen inte är en sträng ignoreras den här parametern.
-
File – Tar indata från en fil i stället för en
<test-expression>
. Filen läss en rad i taget och utvärderas avswitch
-instruktionen. Som standard är jämförelsen skiftlägeskänslig. Parametern File stöder bara en fil. Om flera filparametrar ingår används endast den sista. Mer information finns i Exempel på filparameter. -
Regex – Utför reguljär uttrycksmatchning av värdet till villkoret. Om matchningssatsen inte är en sträng ignoreras den här parametern.
Jämförelsen är skiftlägeskänslig. Den
$Matches
automatiska variabeln är tillgänglig för användning i matchande instruktionsblock.
Kommentar
När du anger motstridiga värden, till exempel Regex och Jokertecken, har den sista angivna parametern företräde och alla motstridiga parametrar ignoreras. Flera instanser av parametrar tillåts också. Men endast den sista parametern som anges används.
Enkla matchningsexempel
I följande exempel jämför switch
-instruktionen testvärdet 3
med vart och ett av villkoren. När testvärdet matchar villkoret utförs åtgärden.
switch (3) {
1 { "It's one." }
2 { "It's two." }
3 { "It's three." }
4 { "It's four." }
}
It's three.
I det här exemplet jämförs värdet med varje villkor i listan. Följande switch
-instruktion har två villkor för värdet 3, vilket visar att alla villkor testas.
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.
Om du vill dirigera switch
att sluta jämföra efter en matchning använder du -instruktionen break
. -instruktionen break
avslutar -instruktionen switch
.
switch (3) {
1 { "It's one." }
2 { "It's two." }
3 { "It's three."; break }
4 { "It's four." }
3 { "Three again." }
}
It's three.
Om testvärdet är en samling, till exempel en matris, utvärderas varje objekt i samlingen i den ordning det visas. Följande exempel utvärderar 4 och sedan 2.
switch (4, 2) {
1 { "It's one." }
2 { "It's two." }
3 { "It's three." }
4 { "It's four." }
3 { "Three again." }
}
It's four.
It's two.
Alla break
instruktioner gäller för samlingen, inte för varje värde, som visas i följande exempel. -instruktionen switch
avslutas av -instruktionen break
i villkoret för värde 4.
switch (4, 2) {
1 { "It's one."; break }
2 { "It's two." ; break }
3 { "It's three." ; break }
4 { "It's four." ; break }
3 { "Three again." }
}
It's four.
Mer komplexa matchningsexempel
I det här exemplet testar -instruktionen switch
för typen av värdet i hashtabellen. Du måste använda och uttryck som returnerar ett booleskt värde för att välja skriptblocket som ska köras.
$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
I det här exemplet skickas ett objekt som inte är en sträng eller numeriska data till switch
.
switch
Utför ett strängtvång på objektet och utvärderar resultatet.
$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
I det här exemplet finns det inget matchande fall så det finns inga utdata.
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." }
}
Genom att lägga till default
-satsen kan du utföra en åtgärd när inga andra villkor lyckas.
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
För att ordet fourteen
ska matcha ett ärende måste du använda parametern -Wildcard
eller -Regex
.
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.
I följande exempel används parametern -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
I följande exempel visas användningen av skriptblock som switch
instruktionsvillkor.
switch ("Test") {
{ $_ -is [string] } { "Found a string" }
"Test" { "This $_ executes as well" }
}
Found a string
This Test executes as well
I följande exempel bearbetas en matris som innehåller två datumvärden. Jämför <value-scriptblock>
egenskapen Year för varje datum.
<action-scriptblock>
Visar ett välkomstmeddelande eller antalet dagar fram till början av året 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!' }
}
Om värdet matchar flera villkor körs åtgärden för varje villkor. Om du vill ändra det här beteendet använder du nyckelorden break
eller continue
.
Nyckelordet break
slutar bearbeta och avslutar -instruktionen switch
.
Nyckelordet continue
slutar bearbeta det aktuella värdet, men fortsätter att bearbeta efterföljande värden.
I följande exempel bearbetas en matris med tal och visas om de är udda eller jämna. Negativa tal hoppas över med nyckelordet continue
. Om ett icke-tal påträffas avslutas körningen med nyckelordet 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
Exempel på filparameter
Att använda switch
-instruktionen med parametern File är ett effektivt sätt att bearbeta stora filer rad för rad. PowerShell strömmar filraderna till switch
-instruktionen. Varje rad bearbetas individuellt.
Du kan avsluta bearbetningen innan du når slutet av filen med hjälp av nyckelordet break
i instruktionen. Instruktionen switch
är effektivare än att använda Get-Content
för att bearbeta stora filer rad för rad.
Du kan kombinera switch -File
med -Wildcard
eller -Regex
för flexibel och effektiv linje-för-rad-mönstermatchning.
I följande exempel läss README.md
i PowerShell-Docs-lagringsplatsen.
Varje rad matas ut tills den når raden som börjar med ##
.
switch -Regex -File .\README.md {
'^##\s' { break }
default { $_; continue }
}
Argumentet <filename>
tolkas som ett jokerteckenuttryck, men det får bara matcha en fil. Följande exempel är detsamma som det föregående, förutom att det använder ett jokertecken i argumentet <filename>
. Det här exemplet fungerar eftersom jokerteckenmönstret endast matchar en fil.
switch -Regex -File .\README.* {
'^##\s' { break }
default { $_; continue }
}
Du måste ta bort tecken som kan tolkas som jokertecken om du vill att de ska behandlas som literaler.
$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