Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Kort beskrivning
Förklarar hur du använder en växel för att hantera flera villkorsstyrda instruktioner.
Lång beskrivning
Om du vill kontrollera ett villkor i ett skript eller en funktion kan du använda 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 kan du använda en switch instruktion. -instruktionen switch liknar en serie if instruktioner, men det är enklare. Instruktionen switch visar varje villkor och motsvarande åtgärd. Om ett villkor matchar utförs åtgärden.
Viktigt!
Instruktionen switch konverterar alla värden till strängar före jämförelse.
Syntax
En grundläggande switch instruktion har följande format:
switch (<test-expression>) {
    <result1-to-be-matched> {<action>}
    <result2-to-be-matched> {<action>}
}
Syntaxen för en switch -instruktion liknar följande if instruktioner:
if ("$(<result1-to-be-matched>)") -eq ("$(<test-expression>)") {<action>}
if ("$(<result2-to-be-matched>)") -eq ("$(<test-expression>)") {<action>}
Uttryck inkluderar literalvärden (strängar eller tal), variabler och skriptblock som returnerar ett booleskt värde. Instruktionen switch konverterar alla värden till strängar före jämförelse. Ett exempel finns i Påverkan av strängkonvertering senare i den här artikeln.
              <test-expression> Utvärderas i uttrycksläge. Om uttrycket returnerar mer än ett värde, till exempel en matris eller annan uppräkningsbar typ, utvärderar instruktionen switch varje uppräknat värde separat.
är <result-to-be-matched> ett uttryck måste matcha till ett enda värde.
Det värdet jämförs med indatavärdet.
Värdet default är reserverat för den åtgärd som används när det inte finns några andra matchningar.
Instruktionen switch kan använda och $_$switch automatiska variabler. 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> . Mer information finns i about_Automatic_Variables.
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 $Matchesautomatiska 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.
Examples
Följande exempel visar hur instruktionen switch 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.
Använda break och continue för att styra flödet
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
Påverkan av strängkonvertering
Alla värden, både indata och jämförelsevärdet konverteras till strängar för jämförelse. Om du vill undvika oavsiktlig strängkonvertering använder du skriptblock för att utvärdera växelvärdet.
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.' }
}
Egenskapen DayOfWeek för datumobjektet är en uppräkning. Även om uppräkningar kan jämföras med deras numeriska värden eller strängvärden konverterar instruktionen switch värdet till en strängrepresentation av uppräkningen.
The string value matches a Thursday.
The expression matches a Thursday.
Det här beteendet skiljer sig från beteendet för jämförelsen -eq i en if -instruktion.
if (4 -eq ([datetime]'1 Jan 1970').DayOfWeek) {
    'The integer value matches a Thursday.'
}
The value matches a Thursday.
I det här exemplet skickas en hashtable till -instruktionen switch . Konverterar switch hashtabellen till en sträng.
$test = @{
    Test  = 'test'
    Test2 = 'test2'
}
$test.ToString()
System.Collections.Hashtable
Observera att strängrepresentationen av hashtabellen inte är samma som värdet för testnyckeln .
switch -Exact ($test) {
    'System.Collections.Hashtable' { 'Hashtable string coercion' }
    'test'                         { 'Hashtable value' }
}
Hashtable string coercion
Använd switch för att testa värdena i en hashtable
I det här exemplet testar -instruktionen switch för typen av värdet i hashtabellen. Vi måste räkna upp objekten i hashtabellen innan vi kan testa värdena. Undvik problem med strängkonvertering genom att använda ett skriptblock som returnerar ett booleskt värde för att välja åtgärden scriptblock 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
Använda jokertecken med switch
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.
Använda reguljära uttryck med switch
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!' }
}
Läsa innehållet i en fil med switch
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> accepterar 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