Freigeben über


about_Switch

Kurzbeschreibung

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 zum Überprüfen mehrerer Bedingungen eine switch-Anweisung. 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 erfüllt ist, 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.

Die <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, 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 Ergebnis der <test-expression> auf der rechten Seite befindet, die 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, 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, genau ü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 einer <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 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

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 switch-Anweisung, um den Vergleich nach einer Übereinstimmung zu beenden, um break den Vergleich 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 parameter -Wildcard 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. 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.

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

Siehe auch