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 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 $_
automatische variabelen en $switch
. Zie about_Automatic_Variables voor meer informatie.
Syntax
Een basic-instructie 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>
is één expressie die wordt geëvalueerd in de expressiemodus om een waarde te retourneren.
De <result-to-be-matched>
is een expressie waarvan de waarde wordt vergeleken met de invoerwaarde. Expressies omvatten letterlijke waarden (tekenreeksen of getallen), variabelen en scriptblokken die een booleaanse waarde retourneren.
Elke waarde zonder aanhalingstekens 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 alle expressies tussen haakjes ()
en maak subexpressies om ervoor te zorgen dat de expressie correct wordt geëvalueerd.
Het is belangrijk om te weten dat de <result-to-be-matched>
waarde zich aan de linkerkant van de vergelijkingsexpressie bevindt. Dit betekent dat het resultaat van de <test-expression>
zich aan de rechterkant bevindt, die kan worden geconverteerd naar het type van de waarde aan de linkerkant voor 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
}
of
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 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 voorwaardeinstructie 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. Er is slechts één default
component toegestaan in elke switch
instructie.
switch
heeft de volgende parameters:
- Jokerteken : geeft aan dat de voorwaarde een tekenreeks met jokertekens 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.
- CaseSensitive : 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 deswitch
-instructie. De vergelijking is niet hoofdlettergevoelig. - Regex : voert een reguliere expressie uit die overeenkomt met de waarde van 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 binnen het overeenkomende instructieblok.
Notitie
Bij het opgeven van conflicterende waarden, zoals Regex en Jokerteken, heeft de laatst opgegeven parameter voorrang en worden alle conflicterende parameters genegeerd. Meerdere exemplaren van parameters zijn ook 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 alle voorwaarden standaard 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 break
de -instructie om te switch
stoppen met vergelijken na een overeenkomst. Met break
de instructie wordt de switch
instructie beëindigd.
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 het 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 een object dat geen tekenreeks of numerieke gegevens is, doorgegeven aan de switch
. De switch
voert een tekenreeks af op het object en evalueert het resultaat.
$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 u wilt dat het woord 'veertien' overeenkomt met een case, moet u de -Wildcard
parameter of -Regex
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 met twee datumwaarden verwerkt. De <value-scriptblock>
vergelijkt de eigenschap Year van elke datum. De <action-scriptblock>
geeft een welkomstbericht weer of het aantal dagen 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. Gebruik de break
trefwoorden of continue
om dit gedrag te wijzigen.
Het break
trefwoord stopt met verwerken en sluit de switch
instructie af.
Het continue
trefwoord stopt met het verwerken van de huidige waarde, maar gaat door met het verwerken van eventuele volgende waarden.
In het volgende voorbeeld wordt een matrix met getallen verwerkt en wordt weergegeven of deze oneven of even 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