about_Switch

Korte beschrijving

Hierin wordt uitgelegd hoe u een switch gebruikt om meerdere if instructies af te handelen.

Lange beschrijving

Als u een voorwaarde in een script of functie wilt controleren, gebruikt u een if instructie. Met if de instructie kunnen veel soorten voorwaarden worden gecontroleerd, waaronder de waarde van variabelen en de eigenschappen van objecten.

Als u meerdere voorwaarden wilt controleren, gebruikt u een switch instructie. De switch instructie is gelijk aan een reeks if instructies, maar dit is eenvoudiger. De switch instructie bevat elke voorwaarde en een optionele actie. Als een voorwaarde wordt verkregen, wordt de actie uitgevoerd.

De switch instructie kan gebruikmaken van de $_ en $switch automatische variabelen. Zie about_Automatic_Variables voor meer informatie.

Syntaxis

Een basisinstructie switch heeft de volgende indeling:

Switch (<test-expression>)
{
    <result1-to-be-matched> {<action>}
    <result2-to-be-matched> {<action>}
}

De equivalente if instructies zijn:

if (<result1-to-be-matched> -eq (<test-expression>)) {<action>}
if (<result2-to-be-matched> -eq (<test-expression>)) {<action>}

De <test-expression> expressie is één expressie die wordt geëvalueerd in de expressiemodus om een waarde te retourneren.

Dit <result-to-be-matched> is een expressie waarvan de waarde wordt vergeleken met de invoerwaarde. Expressies omvatten letterlijke waarden (tekenreeksen of getallen), variabelen en scriptblokkeringen die een booleaanse waarde retourneren.

Elke niet-aanhalingstekende waarde die niet wordt herkend als een getal, wordt behandeld als een tekenreeks. Om verwarring of onbedoelde tekenreeksconversie te voorkomen, moet u altijd tekenreekswaarden citeren. Plaats eventuele expressies tussen haakjes (), het maken van subexpressies, om ervoor te zorgen dat de expressie correct wordt geëvalueerd.

Het is belangrijk om te begrijpen dat de <result-to-be-matched> waarde zich aan de linkerkant van de vergelijkingsexpressie bevindt. Dat betekent dat het resultaat van het <test-expression> bestand zich aan de rechterkant bevindt, dat kan worden geconverteerd naar het type linkse waarde ter vergelijking. Zie about_Comparison_Operators voor meer informatie

De waarde default is gereserveerd voor de actie die wordt gebruikt wanneer er geen andere overeenkomsten zijn.

De $_ automatische variabele bevat de waarde van de expressie die is doorgegeven aan de switch instructie en is beschikbaar voor evaluatie en gebruik binnen het bereik van de <result-to-be-matched> instructies.

De syntaxis van de volledige switch instructie is als volgt:

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
}

Als er geen parameters worden gebruikt, switch gedraagt u zich hetzelfde als het gebruik van de parameter Exact . Er wordt een niet-hoofdlettergevoelige overeenkomst voor de waarde uitgevoerd. Als de waarde een verzameling is, wordt elk element geëvalueerd in de volgorde waarin het wordt weergegeven.

De switch instructie moet ten minste één voorwaarde-instructie bevatten.

De default component wordt geactiveerd wanneer de waarde niet overeenkomt met een van de voorwaarden. Het is gelijk aan een else component in een if instructie. In elke switch instructie is slechts één default component toegestaan.

switch heeft de volgende parameters:

  • Jokerteken : geeft aan dat de voorwaarde een jokertekenreeks is. Als de overeenkomstcomponent geen tekenreeks is, wordt de parameter genegeerd. De vergelijking is niet hoofdlettergevoelig.
  • Exact : geeft aan dat de overeenkomstcomponent, als het een tekenreeks is, exact moet overeenkomen. Als de overeenkomstcomponent geen tekenreeks is, wordt deze parameter genegeerd. De vergelijking is niet hoofdlettergevoelig.
  • Hoofdlettergevoelig : voert een hoofdlettergevoelige overeenkomst uit. Als de overeenkomstcomponent geen tekenreeks is, wordt deze parameter genegeerd.
  • Bestand: neemt invoer van een bestand in plaats van een <test-expression>. Als er meerdere bestandsparameters zijn opgenomen, wordt alleen de laatste gebruikt. Elke regel van het bestand wordt gelezen en geëvalueerd door de switch instructie. De vergelijking is niet hoofdlettergevoelig.
  • Regex : voert reguliere expressies uit die overeenkomen met de waarde aan de voorwaarde. Als de overeenkomstcomponent geen tekenreeks is, wordt deze parameter genegeerd. De vergelijking is niet hoofdlettergevoelig. De $matches automatische variabele is beschikbaar voor gebruik in het overeenkomende instructieblok.

Notitie

Bij het opgeven van conflicterende waarden, zoals Regex en Jokerteken, heeft de laatste opgegeven parameter voorrang en worden alle conflicterende parameters genegeerd. Er zijn ook meerdere exemplaren van parameters toegestaan. Alleen de laatst vermelde parameter wordt echter gebruikt.

Voorbeelden

In het volgende voorbeeld vergelijkt de switch instructie de testwaarde, 3, met elk van de voorwaarden. Wanneer de testwaarde overeenkomt met de voorwaarde, wordt de actie uitgevoerd.

switch (3)
{
    1 {"It is one."}
    2 {"It is two."}
    3 {"It is three."}
    4 {"It is four."}
}
It is three.

In dit eenvoudige voorbeeld wordt de waarde vergeleken met elke voorwaarde in de lijst, ook al is er een overeenkomst voor de waarde 3. De volgende switch instructie heeft twee voorwaarden voor een waarde van 3. Het laat zien dat standaard alle voorwaarden worden getest.

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.

Gebruik de break instructie om te switch stoppen met vergelijken na een overeenkomst. De break instructie beëindigt de switch instructie.

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.

Als de testwaarde een verzameling is, zoals een matrix, wordt elk item in de verzameling geëvalueerd in de volgorde waarin deze wordt weergegeven. In de volgende voorbeelden worden 4 en vervolgens 2 geëvalueerd.

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 instructies zijn van toepassing op de verzameling, niet op elke waarde, zoals wordt weergegeven in het volgende voorbeeld. De switch instructie wordt beëindigd door de break instructie in de voorwaarde van waarde 4.

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 dit voorbeeld wordt met de switch instructie getest op het type waarde in de hashtabel. U moet een booleaanse waarde gebruiken en expressies gebruiken om het scriptblok te selecteren dat moet worden uitgevoerd.

$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 dit voorbeeld wordt een object dat geen tekenreeks of numerieke gegevens is, doorgegeven aan de switch. Hiermee switch wordt een tekenreeks coercion uitgevoerd op het object en wordt het resultaat geëvalueerd.

$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 dit voorbeeld is er geen overeenkomende case, dus er is geen uitvoer.

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

Door de default component toe te voegen, kunt u een actie uitvoeren wanneer er geen andere voorwaarden slagen.

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

Als het woord 'veertien' overeenkomt met een case, moet u de -Wildcard of -Regex parameter gebruiken.

   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.

In het volgende voorbeeld wordt de -Regex parameter gebruikt.

$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

In het volgende voorbeeld ziet u het gebruik van scriptblokken als switch instructievoorwaarden.

switch ("Test")
{
    {$_ -is [String]} {
        "Found a string"
    }
    "Test" {
        "This $_ executes as well"
    }
}
Found a string
This Test executes as well

In het volgende voorbeeld wordt een matrix verwerkt die twee datumwaarden bevat. Hiermee <value-scriptblock> wordt de eigenschap Year van elke datum vergeleken. Er <action-scriptblock> wordt een welkomstbericht of het aantal dagen weergegeven tot het begin van het jaar 2022.

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

Als de waarde overeenkomt met meerdere voorwaarden, wordt de actie voor elke voorwaarde uitgevoerd. Als u dit gedrag wilt wijzigen, gebruikt u de break trefwoorden of continue trefwoorden.

Het break trefwoord stopt met verwerken en sluit de switch instructie af.

Het continue trefwoord stopt met het verwerken van de huidige waarde, maar blijft alle volgende waarden verwerken.

In het volgende voorbeeld wordt een matrix met getallen verwerkt en weergegeven of ze oneven of zelfs zijn. Negatieve getallen worden overgeslagen met het continue trefwoord. Als er een niet-getal wordt aangetroffen, wordt de uitvoering beëindigd met het break trefwoord.

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

Zie ook