Freigeben über


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 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 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 testet die switch -Anweisung den Typ des Werts in der Hashtabelle. Sie müssen den Ausdruck und verwenden, der einen booleschen Wert zurückgibt, um den auszuführenden Skriptblock 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, 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

Weitere Informationen