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>}

Der <test-expression> einzelne Ausdruck wird im Ausdrucksmodus ausgewertet, 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
}

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 Exact-Parameters . 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. Sie entspricht einer else Klausel in einer if Anweisung. In jeder switch Anweisung ist nur eine default Klausel zulässig.

switch hat die folgenden Parameter:

  • Wild Karte – Gibt an, dass die Bedingung eine wild Karte Zeichenfolge ist. Wenn die Übereinstimmungsklausel keine Zeichenfolge ist, wird der Parameter ignoriert. Bei dem Vergleich wird Groß- und Kleinschreibung nicht unterschieden.
  • Genau – 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: Verwendet Eingaben aus einer Datei anstelle eines <test-expression>. Wenn mehrere Dateiparameter enthalten sind, wird nur der letzte Parameter verwendet. Jede Zeile der Datei wird von der switch 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 Ü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 Wild Karte 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

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 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 für den Wert 3 eine Übereinstimmung vorhanden ist. Die folgende switch Anweisung hat zwei Bedingungen für einen Wert von 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 die break 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 er 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 durch die break Anweisung in der Bedingung von Wert 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 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 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 Oder-Parameter -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. 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. Um dieses Verhalten zu ändern, verwenden Sie die break oder continue Schlüsselwort (keyword).

Die break Schlüsselwort (keyword) beendet die Verarbeitung und beendet die switch Anweisung.

Die continue Schlüsselwort (keyword) beendet die Verarbeitung des aktuellen Werts, verarbeitet jedoch alle nachfolgenden Werte.

Im folgenden Beispiel wird ein Array von Zahlen verarbeitet und angezeigt, ob sie ungerade oder gerade sind. Negative Zahlen werden mit dem continue Schlüsselwort (keyword) übersprungen. Wenn eine Nichtnummer auftritt, 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

Weitere Informationen