Freigeben über


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 der switch-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

Siehe auch