about_Switch
Kurze Beschreibung
Erläutert die Verwendung eines Schalters zum Behandeln mehrerer if
Anweisungen.
Lange Beschreibung
Verwenden Sie eine -Anweisung, um eine Bedingung in einem Skript oder einer if
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 abgerufen wird, wird die Aktion ausgeführt.
Die switch
-Anweisung kann die automatischen $_
Variablen und $switch
verwenden. Weitere Informationen finden Sie unter about_Automatic_Variables.
Syntax
Eine basic-Anweisung switch
hat das folgende Format:
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>}
Ist <test-expression>
ein einzelner Ausdruck, der im Ausdrucksmodus ausgewertet wird, um einen Wert zurückzugeben.
ist <result-to-be-matched>
ein Ausdruck, dessen Wert mit dem Eingabewert verglichen wird. Ausdrücke umfassen Literalwerte (Zeichenfolgen oder Zahlen), Variablen und Skriptblöcke, die einen booleschen Wert zurückgeben.
Jeder Wert ohne Anführungszeichen, der nicht als Zahl erkannt wird, wird als Zeichenfolge behandelt.
Um Verwirrung oder unbeabsichtigte Zeichenfolgenkonvertierung zu vermeiden, sollten Sie immer Zeichenfolgenwerte in Anführungszeichen stellen. Schließen Sie alle Ausdrücke in Klammern ()
ein, und erstellen Sie Teilausdrücke, um sicherzustellen, dass der Ausdruck ordnungsgemäß 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 Ergebnis des <test-expression>
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 an die switch
Anweisung übergebenen Ausdrucks und steht für die Auswertung und Verwendung innerhalb des Bereichs 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
}
oder
switch [-regex | -wildcard | -exact] [-casesensitive] -file filename
{
"string" | number | variable | { <value-scriptblock> } { <action-scriptblock> }
default { <action-scriptblock> } # optional
}
Wenn keine Parameter verwendet werden, switch
verhält sich dasselbe wie die Verwendung des Parameters Exact . Für den Wert wird eine Übereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung durchgeführt. Wenn der Wert eine Auflistung ist, wird jedes Element in der Reihenfolge ausgewertet, in der es angezeigt wird.
Die switch
Anweisung muss mindestens eine Bedingungsanweisung enthalten.
Die default
-Klausel wird ausgelöst, wenn der Wert keiner der Bedingungen entspricht. Sie entspricht einer else
-Klausel in einer if
-Anweisung. In jeder switch
Anweisung ist nur eine default
Klausel zulässig.
switch
verfügt über die folgenden Parameter:
- Wildcard : Gibt an, dass es sich bei der Bedingung um eine Wildcardzeichenfolge handelt. Wenn die match-Klausel keine Zeichenfolge ist, wird der Parameter ignoriert. Bei dem Vergleich wird Groß- und Kleinschreibung nicht unterschieden.
- Genau : Gibt an, dass die match-Klausel genau übereinstimmen muss, wenn es sich um eine Zeichenfolge handelt. Wenn die match-Klausel keine Zeichenfolge ist, wird dieser Parameter ignoriert. Bei dem Vergleich wird Groß- und Kleinschreibung nicht unterschieden.
- Beachtung der Groß-/Kleinschreibung : Führt eine Übereinstimmung zwischen Groß- und Kleinschreibung aus. Wenn die match-Klausel keine Zeichenfolge ist, wird dieser Parameter ignoriert.
- Datei: Akzeptiert Eingaben aus einer Datei anstelle von
<test-expression>
. Wenn mehrere File-Parameter enthalten sind, wird nur der letzte parameter verwendet. Jede Zeile der Datei wird von derswitch
-Anweisung gelesen und ausgewertet. Bei dem Vergleich wird Groß- und Kleinschreibung nicht unterschieden. - Regex : Führt einen Regulären Ausdrucksabgleich des Werts mit der Bedingung aus. Wenn die match-Klausel 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 in Konflikt stehenden Werten wie Regex und Wildcard hat der zuletzt angegebene Parameter Vorrang, und alle in Konflikt stehenden Parameter werden ignoriert. Mehrere Instanzen von Parametern sind ebenfalls zulässig. Es wird jedoch nur der zuletzt aufgeführte Parameter verwendet.
Beispiele
Im folgenden Beispiel vergleicht die switch
Anweisung den Testwert 3 mit jeder der Bedingungen. Wenn der Testwert mit der Bedingung übereinstimmt, wird die Aktion ausgeführt.
switch (3)
{
1 {"It is one."}
2 {"It is two."}
3 {"It is three."}
4 {"It is four."}
}
It is three.
In diesem einfachen Beispiel wird der Wert mit jeder Bedingung in der Liste verglichen, obwohl eine Übereinstimmung für den Wert 3 vorhanden ist. Die folgende switch
Anweisung hat zwei Bedingungen für den Wert 3. Es zeigt, dass standardmäßig alle Bedingungen getestet werden.
switch (3)
{
1 {"It is one."}
2 {"It is two."}
3 {"It is three."}
4 {"It is four."}
3 {"Three again."}
}
It is three.
Three again.
Verwenden Sie break
die -Anweisung, um den switch
Vergleich nach einer Übereinstimmung zu beenden. Die break
-Anweisung beendet die switch
-Anweisung.
switch (3)
{
1 {"It is one."}
2 {"It is two."}
3 {"It is three."; Break}
4 {"It is four."}
3 {"Three again."}
}
It is three.
Wenn der Testwert eine Auflistung ist, z. B. ein Array, wird jedes Element in der Auflistung in der Reihenfolge ausgewertet, in der es angezeigt wird. In den folgenden Beispielen werden 4 und dann 2 ausgewertet.
switch (4, 2)
{
1 {"It is one." }
2 {"It is two." }
3 {"It is three." }
4 {"It is four." }
3 {"Three again."}
}
It is four.
It is two.
Alle break
Anweisungen gelten für die Auflistung, nicht für jeden Wert, wie im folgenden Beispiel gezeigt. Die switch
-Anweisung wird von der break
-Anweisung in der Bedingung des Werts 4 beendet.
switch (4, 2)
{
1 {"It is one."; Break}
2 {"It is two." ; Break }
3 {"It is three." ; Break }
4 {"It is four." ; Break }
3 {"Three again."}
}
It is four.
In diesem Beispiel wird ein Objekt, bei dem es sich nicht um eine Zeichenfolge oder numerische Daten handelt, an die switch
übergeben. führt switch
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 is one."; Break}
2 {"It is two."; Break}
3 {"It is three."; Break}
4 {"It is 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 is one."; Break}
2 {"It is two."; Break}
3 {"It is three."; Break}
4 {"It is four."; Break}
"fo*" {"That's too many."}
Default {
"No matches"
}
}
No matches
Damit das Wort "vierzehn" mit einem Fall übereinstimmt, müssen Sie den -Wildcard
-Parameter oder -Regex
verwenden.
PS> switch -Wildcard ("fourteen")
{
1 {"It is one."; Break}
2 {"It is two."; Break}
3 {"It is three."; Break}
4 {"It is 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. Vergleicht <value-scriptblock>
die Year-Eigenschaft jedes Datums. Zeigt <action-scriptblock>
eine Willkommensnachricht oder die Anzahl der Tage bis zum Beginn 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 mit mehreren Bedingungen übereinstimmt, wird die Aktion für jede Bedingung ausgeführt. Verwenden Sie die break
Schlüsselwörter oder continue
, um dieses Verhalten zu ändern.
Die break
Schlüsselwort (keyword) beendet die Verarbeitung und beendet die switch
Anweisung.
Die continue
Schlüsselwort (keyword) die Verarbeitung des aktuellen Werts beendet, aber die Verarbeitung aller nachfolgenden Werte wird fortgesetzt.
Im folgenden Beispiel wird ein Array von Zahlen verarbeitet und angezeigt, ob sie ungerade oder gerade Zahlen sind. Negative Zahlen werden mit dem continue
Schlüsselwort (keyword) übersprungen. Wenn eine Nichtnummer gefunden wird, wird die Ausführung mit dem break
Schlüsselwort (keyword) 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