about_Switch
Kurze Beschreibung
Erläutert die Verwendung eines Schalters zum Behandeln mehrerer if
Anweisungen.
Lange Beschreibung
Verwenden Sie eine if
Anweisung, um eine Bedingung in einem Skript oder einer Funktion zu überprüfen. Die if
Anweisung kann viele Arten von Bedingungen überprüfen, einschließlich des Werts von Variablen und der Eigenschaften von Objekten.
Verwenden Sie eine switch
Anweisung, um mehrere Bedingungen zu überprüfen. Die switch
-Anweisung entspricht einer Reihe von if
Anweisungen, ist aber einfacher. Die switch
Anweisung listet jede Bedingung und eine optionale Aktion auf. Wenn eine Bedingung erhalten wird, wird die Aktion ausgeführt.
Die switch
Anweisung kann die $_
und $switch
die automatischen Variablen verwenden. Weitere Informationen finden Sie unter about_Automatic_Variables.
Syntax
Eine grundlegende switch
Anweisung weist das folgende Format auf:
switch (<test-expression>)
{
<result1-to-be-matched> {<action>}
<result2-to-be-matched> {<action>}
}
Die entsprechenden if
Anweisungen sind:
if (<result1-to-be-matched> -eq (<test-expression>)) {<action>}
if (<result2-to-be-matched> -eq (<test-expression>)) {<action>}
Die <test-expression>
ist ein einzelner Ausdruck, der im Ausdrucksmodus ausgewertet wird, um einen Wert zurückzugeben.
Dies <result-to-be-matched>
ist ein Ausdruck, dessen Wert mit dem Eingabewert verglichen wird. Ausdrücke umfassen Literalwerte (Zeichenfolgen oder Zahlen), Variablen und Skriptblocks, die einen booleschen Wert zurückgeben.
Ein nicht angestellter Wert, der nicht als Zahl erkannt wird, wird als Zeichenfolge behandelt.
Um Verwirrung oder unbeabsichtigte Zeichenfolgenkonvertierung zu vermeiden, sollten Sie immer Zeichenfolgenwerte anführungszeichen. Schließen Sie alle Ausdrücke in Klammern ()
ein, erstellen Sie Unterausdrücke, um sicherzustellen, dass der Ausdruck korrekt ausgewertet wird.
Es ist wichtig zu verstehen, dass sich der <result-to-be-matched>
Wert auf der linken Seite des Vergleichsausdrucks befindet. Das bedeutet, dass sich das <test-expression>
Ergebnis auf der rechten Seite befindet, das zum Vergleich in den Typ des linksseitigen Werts konvertiert werden kann. Weitere Informationen finden Sie unter about_Comparison_Operators
Der Wert default
ist für die Aktion reserviert, die verwendet wird, wenn keine anderen Übereinstimmungen vorhanden sind.
Die $_
automatische Variable enthält den Wert des Ausdrucks, der an die switch
Anweisung übergeben wird, und steht für die Auswertung und Verwendung im Bereich der <result-to-be-matched>
Anweisungen zur Verfügung.
Die vollständige switch
Anweisungssyntax lautet wie folgt:
switch [-Regex | -Wildcard | -Exact] [-CaseSensitive] (<test-expression>) {
string | number | variable | { <value-scriptblock> }
{ <action-scriptblock> }
default { <action-scriptblock> } # optional
}
or
switch [-Regex | -Wildcard | -Exact] [-CaseSensitive] -File filename {
string | number | variable | { <value-scriptblock> }
{ <action-scriptblock> }
default { <action-scriptblock> } # optional
}
Wenn Sie keine Parameter verwenden, verhält sich switch
mit der Verwendung des Parameters Exact identisch. Es führt eine Übereinstimmung zwischen Groß-/Kleinschreibung für den Wert durch. Wenn es sich bei dem Wert um eine Auflistung handelt, wird jedes Element in der Reihenfolge ausgewertet, in der er angezeigt wird.
Die switch
Anweisung muss mindestens eine Bedingungsanweisung enthalten.
Die default
-Klausel wird ausgelöst, wenn der Wert keiner der Bedingungen entspricht. Es entspricht einer else
-Klausel in einer if
-Anweisung. In jeder default
Anweisung ist nur eine switch
Klausel zulässig.
switch
hat die folgenden Parameter:
- Wildcard – Gibt an, dass es sich bei der Bedingung um eine Wildcardzeichenfolge handelt. Wenn die Übereinstimmungsklausel keine Zeichenfolge ist, wird der Parameter ignoriert. Bei dem Vergleich wird Groß- und Kleinschreibung nicht unterschieden.
- Genaue – Gibt an, dass die Übereinstimmungsklausel, wenn es sich um eine Zeichenfolge handelt, exakt übereinstimmen muss. Wenn die Übereinstimmungsklausel keine Zeichenfolge ist, wird dieser Parameter ignoriert. Bei dem Vergleich wird Groß- und Kleinschreibung nicht unterschieden.
- Groß-/Kleinschreibung – Führt eine Übereinstimmung zwischen Groß- und Kleinschreibung durch. Wenn die Übereinstimmungsklausel keine Zeichenfolge ist, wird dieser Parameter ignoriert.
-
Datei- – Übernimmt Eingaben aus einer Datei anstelle eines
<test-expression>
. Die Datei wird jeweils in einer Zeile gelesen und von derswitch
-Anweisung ausgewertet. Standardmäßig wird bei dem Vergleich die Groß-/Kleinschreibung beachtet. Der parameter File unterstützt nur eine Datei. Wenn mehrere Dateiparameter enthalten sind, wird nur der letzte Parameter verwendet. Weitere Informationen finden Sie unter Dateiparameterbeispiele. -
Regex – Führt einen regulären Ausdrucksabgleich des Werts mit der Bedingung aus. Wenn die Übereinstimmungsklausel keine Zeichenfolge ist, wird dieser Parameter ignoriert.
Bei dem Vergleich wird Groß- und Kleinschreibung nicht unterschieden. Die
$Matches
automatische Variable ist für die Verwendung innerhalb des übereinstimmenden Anweisungsblocks verfügbar.
Hinweis
Beim Angeben von widersprüchlichen Werten wie Regex und Wildcard hat der letzte angegebene Parameter Vorrang, und alle widersprüchlichen Parameter werden ignoriert. Es sind auch mehrere Instanzen von Parametern zulässig. Es wird jedoch nur der letzte aufgeführte Parameter verwendet.
Beispiele für einfache Übereinstimmungen
Im folgenden Beispiel vergleicht die switch
-Anweisung den Testwert 3
mit den einzelnen Bedingungen. Wenn der Testwert der Bedingung entspricht, wird die Aktion ausgeführt.
switch (3) {
1 { "It's one." }
2 { "It's two." }
3 { "It's three." }
4 { "It's four." }
}
It's three.
In diesem Beispiel wird der Wert mit jeder Bedingung in der Liste verglichen. Die folgende switch
Anweisung hat zwei Bedingungen für einen Wert von 3, was zeigt, dass alle Bedingungen getestet werden.
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.
Verwenden Sie die switch
Anweisung, um den break
Vergleich nach einer Übereinstimmung zu beenden. Die break
Anweisung beendet die switch
Anweisung.
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.
Wenn der Testwert eine Auflistung ist, z. B. ein Array, wird jedes Element in der Auflistung in der Reihenfolge ausgewertet, in der er angezeigt wird. In den folgenden Beispielen werden 4 und dann 2 ausgewertet.
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.
Alle break
Anweisungen gelten für die Auflistung, nicht für jeden Wert, wie im folgenden Beispiel gezeigt. Die switch
Anweisung wird durch die break
Anweisung in der Bedingung von Wert 4 beendet.
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.
Komplexere Übereinstimmungsbeispiele
In diesem Beispiel wird die switch
Anweisung auf den Typ des Werts in der Hashtabelle getestet. Sie müssen einen booleschen Wert verwenden und ausdrucken, um den auszuführenden Scriptblock auszuwählen.
$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
In diesem Beispiel wird ein Objekt, das keine Zeichenfolge oder numerische Daten ist, an die switch
übergeben. Die switch
Führt eine Zeichenfolgenkoersion für das Objekt aus und wertet das Ergebnis aus.
$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
In diesem Beispiel gibt es keinen übereinstimmenden Fall, sodass keine Ausgabe vorhanden ist.
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." }
}
Durch Hinzufügen der default
Klausel können Sie eine Aktion ausführen, wenn keine anderen Bedingungen erfolgreich sind.
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
Damit das Wort fourteen
einem Fall entspricht, müssen Sie den parameter -Wildcard
oder -Regex
verwenden.
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.
Im folgenden Beispiel wird der -Regex
Parameter verwendet.
$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
Im folgenden Beispiel wird die Verwendung von Skriptblöcken als switch
Anweisungsbedingungen veranschaulicht.
switch ("Test") {
{ $_ -is [string] } { "Found a string" }
"Test" { "This $_ executes as well" }
}
Found a string
This Test executes as well
Im folgenden Beispiel wird ein Array verarbeitet, das zwei Datumswerte enthält. Die <value-scriptblock>
Eigenschaft "Year" jedes Datums wird verglichen. Die <action-scriptblock>
Anzeige zeigt eine Willkommensnachricht oder die Anzahl der Tage bis zum Anfang des Jahres 2022 an.
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!' }
}
Wenn der Wert mehreren Bedingungen entspricht, wird die Aktion für jede Bedingung ausgeführt. Verwenden Sie die break
Schlüsselwörter, continue
um dieses Verhalten zu ändern.
Das break
Schlüsselwort beendet die Verarbeitung und beendet die switch
Anweisung.
Das continue
Schlüsselwort beendet die Verarbeitung des aktuellen Werts, verarbeitet aber alle nachfolgenden Werte weiter.
Das folgende Beispiel verarbeitet ein Array von Zahlen und zeigt an, ob sie ungerade oder gerade sind. Negative Zahlen werden mit dem continue
Schlüsselwort übersprungen. Wenn keine Zahl auftritt, wird die Ausführung mit dem break
Schlüsselwort beendet.
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
Beispiele für Dateiparameter
Die Verwendung der switch
-Anweisung mit dem Parameter File ist eine effiziente Möglichkeit, große Dateien zeilenweise zu verarbeiten. PowerShell streamt die Zeilen der Datei an die switch
-Anweisung. Jede Zeile wird einzeln verarbeitet.
Sie können die Verarbeitung beenden, bevor Sie das Ende der Datei erreichen, indem Sie das schlüsselwort break
in der Action-Anweisung verwenden. Die switch
-Anweisung ist effizienter als die Verwendung von Get-Content
zum Verarbeiten großer Dateien zeilenzeil.the switch
statement is more efficient than using Get-Content
to process large files line by line.
Sie können switch -File
mit -Wildcard
oder -Regex
kombinieren, um flexible und effiziente Linienmusterabgleiche zu ermöglichen.
Im folgenden Beispiel wird die README.md
im PowerShell-Docs Repository gelesen.
Sie gibt jede Zeile aus, bis sie die Zeile erreicht, die mit ##
beginnt.
switch -Regex -File .\README.md {
'^##\s' { break }
default { $_; continue }
}
Das argument <filename>
wird als Wildcardausdruck interpretiert, muss jedoch nur mit einer Datei übereinstimmen. Das folgende Beispiel entspricht dem vorherigen, mit der Ausnahme, dass im argument <filename>
ein Wildcard verwendet wird. Dieses Beispiel funktioniert, da das Wildcardmuster nur einer Datei entspricht.
switch -Regex -File .\README.* {
'^##\s' { break }
default { $_; continue }
}
Sie müssen Escapezeichen enthalten, die als Wildcards interpretiert werden können, wenn sie als Literale behandelt werden sollen.
$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