Wat is de PowerShell-syntaxis voor meerdere waarden in een switch-instructie?

Ik wil eigenlijk dit doen:

switch($someString.ToLower())
{
    "y", "yes" { "You entered Yes." }
    default { "You entered No." }
}

Antwoord 1, autoriteit 100%

switch($someString.ToLower()) 
{ 
    {($_ -eq "y") -or ($_ -eq "yes")} { "You entered Yes." } 
    default { "You entered No." } 
}

Antwoord 2, autoriteit 55%

Ik ontdekte dat dit werkt en leesbaarder lijkt:

switch($someString)
{
    { @("y", "yes") -contains $_ } { "You entered Yes." }
    default { "You entered No." }
}

De operator “-contains” voert een niet-hoofdlettergevoelige zoekopdracht uit, dus u hoeft “ToLower()” niet te gebruiken. Als je wilt dat het hoofdlettergevoelig is, kun je in plaats daarvan “-ccontains” gebruiken.


Antwoord 3, autoriteit 46%

U zou een jokerteken moeten kunnen gebruiken voor uw waarden:

switch -wildcard ($someString.ToLower())
{
    "y*" { "You entered Yes." }
    default { "You entered No." }
}

Reguliere uitdrukkingen zijn ook toegestaan.

switch -regex ($someString.ToLower())
{
    "y(es)?" { "You entered Yes." }
    default { "You entered No." }
}

Documentatie voor PowerShell-switches: De overstapverklaring gebruiken


Antwoord 4, autoriteit 7%

switch($someString.ToLower())
{
    "yes"   { $_ = "y" }
    "y"     { "You entered Yes." }
    default { "You entered No." }
}

U kunt op deze manier willekeurig zaken vertakken, cascaderen en samenvoegen, zolang het doelgeval zich onder/nahet geval of de gevallen bevindt waar de variabele $_ respectievelijk opnieuw is toegewezen.

p>


nb. Hoe schattig dit gedrag ook is, het lijkt te onthullen dat de PowerShell-interpreter switch/case niet zo efficiënt implementeert als men zou hopen of aannemen. Ten eerste suggereert het gebruik van de ISE-debugger dat in plaats van geoptimaliseerde lookup, hashing of binaire vertakking, elk geval op zijn beurt wordt getest, zoals zoveel if-else-instructies. (Als dat het geval is, overweeg dan om uw meest voorkomende gevallen eerst te plaatsen.) Zoals in dit antwoord wordt weergegeven, gaat PowerShell verder met het testen van gevallen nadat er een is voldaan. En gek genoeg is er zelfs een speciaal geoptimaliseerde ‘switch’-opcode beschikbaar in .NET CIL waarvan PowerShell vanwege dit gedrag geen gebruik kan maken.


Antwoord 5, autoriteit 5%

Ondersteunt het invoeren van y|ye|yes en niet hoofdlettergevoelig.

switch -regex ($someString.ToLower()) {
        "^y(es?)?$" {
            "You entered Yes." 
        }
        default { "You entered No." }
}

Antwoord 6, autoriteit 5%

Een kleine wijziging aan het bericht van derekerdmann om aan het oorspronkelijke verzoek te voldoen met behulp van de regex-alternatie-operator “|”(pipe).

Het is ook iets gemakkelijker voor regex-beginners om te begrijpen en te lezen.

Houd er rekening mee dat als u tijdens het gebruik van regex het begin van het tekenreeksteken “^”(caret/circumflex) en/of het einde van het tekenreeksteken “$”(dollar) niet plaatst, u onverwacht/niet-intuïtief gedrag kunt krijgen ( zoals overeenkomen met “gisteren” of “waarom”).

Het plaatsen van groeperingstekens “()”(haakjes) rond de opties vermindert de noodzaak om voor elke optie het begin en einde van tekenreeksen te plaatsen. Zonder hen krijg je mogelijk onverwacht gedrag als je niet handig bent met regex. Als u geen gebruikersinvoer verwerkt, maar een reeks bekende tekenreeksen, is deze natuurlijk beter leesbaar zonder groepering en begin en einde van tekenreeksen.

switch -regex ($someString) #many have noted ToLower() here is redundant
{
        #processing user input
    "^(y|yes|indubitably)$" { "You entered Yes." }
        # not processing user input
    "y|yes|indubitably" { "Yes was the selected string" } 
    default { "You entered No." } 
}

Other episodes