2010-08-16 7 views

Antwort

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

kann auch '{$ _ -in" y "," ja "}' aber ich bin mir nicht sicher seit welcher PS-Version. – tkokasih

+2

@wannabeprogrammer [Der ** In ** -Operator wurde in Windows PowerShell 3.0 eingeführt.] (Https://technet.microsoft.com/en-us/library/hh847759.aspx) –

+3

-eq unterscheidet zwischen Groß- und Kleinschreibung, wenn ein Zeichenfolgenvergleich durchgeführt wird So ToLower ist nicht erforderlich –

33

Sie sollten eine Wildcard für Ihre Werte verwenden können:

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

Reguläre Ausdrücke sind ebenfalls erlaubt.

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

Powershell-Switch-Dokumentation: http://technet.microsoft.com/en-us/library/ff730937.aspx

+1

Dies ist eine großartige Lösung, obwohl "technisch", da ich separate Werte verwenden wollte, habe ich Fletcher als die Antwort markiert. – Micah

+2

Gut genug, obwohl ein anderer regulärer Ausdruck wahrscheinlich das Gleiche tun könnte. – derekerdmann

+2

Regex Ansatz wäre prägnanter. – mseery

4

Unterstützt y Eingabe | ye | ja und Groß- und Kleinschreibung.

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

Eigentlich entspricht Ihr Ausdruck "[yes]" einem beliebigen Vorkommen der Zeichen 'y', 'e' oder 's' irgendwo in $ averyString. Selbst wenn $ someString "nein! Nein! Nein! S" ist, wird der Schalterblock "Sie haben Ja eingegeben" zurückgegeben. wegen des nachlaufenden 's'. Um zu y | ye | yes zu passen, sollte der Ausdruck "^ y (es?)? $" Sein. – BACON

36

Ich weiß, dass dies ein alter Thread, aber ich fand, dass dies funktioniert und scheint besser lesbar:

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

Der „-contains“ Operator eine nicht-Groß- und Kleinschreibung Suche durchführt, so dass Sie don‘ t müssen "ToLower()" verwenden. Wenn die Groß-/Kleinschreibung beachtet werden soll, können Sie stattdessen "-ccontains" verwenden.

-2

Nach der Suche nach einer Lösung für das gleiche Problem wie Sie, habe ich dieses kleine Thema hier gefunden. Im Vorfeld habe ich eine viel glattere Lösung für diesen Schalter, case-Anweisung

switch($someString) #switch is caseINsensitive, so you don't need to lower 
{ 
    { 'y' -or 'yes' } { "You entered Yes." } 
    default { "You entered No." } 
} 
+2

{'y' oder 'ja'} wird immer als wahr ausgewertet, so dass der Standardzweig nie getroffen wird –

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

Sie beliebig verzweigen, Kaskade und verschmelzen Fälle auf diese Weise, solange der Zielfall unten befindet/nach der Fall oder die Fälle, in denen die Variable $ _ jeweils neu zugewiesen wird.


N. B. So süß dieses Verhalten auch ist, es scheint zu enthüllen, dass der PowerShell-Interpreter switch/case nicht so effizient implementiert, wie man es sich vorstellen kann. Zum einen schlägt der Schritt mit dem ISE-Debugger vor, dass anstelle von optimiertem Nachschlagen, Hashing oder binärer Verzweigung jeder Fall der Reihe nach getestet wird, wie es bei vielen if-else-Anweisungen der Fall ist. (Wenn dies der Fall ist, sollten Sie die häufigsten Fälle zuerst behandeln.) Wie in dieser Antwort gezeigt, testet PowerShell weiterhin Fälle, nachdem sie eine erfüllt haben. Und grausam genug, es gibt sogar einen speziell optimierten "Switch" -Opcode, der in .NET CIL verfügbar ist und aufgrund dessen PowerShell keinen Vorteil daraus ziehen kann.

+0

Es ist nicht süß - es ist dokumentiert. Fügen Sie eine break-Anweisung hinzu, wenn nachfolgende Zweige nicht ausgewertet werden sollen. – Frank

+1

@Frank Fairerweise war "niedlich" vielleicht nicht das beste Wort, um auf ein Schlüsselwort-Verhalten Bezug zu nehmen, das gegenüber seiner historischen Semantik in zahlreichen Sprachen seit 'C' (1975) oder früher verändert oder atypisch ist. –

1

Eine kleine Modifikation von derekerdmann's post, um die ursprüngliche Anfrage zu erfüllen, indem man den Alternationsoperator "|" (pipe) von regex verwendet.

Es ist auch etwas einfacher für Regex-Neulinge zu verstehen und zu lesen.

Beachten Sie, dass bei der Verwendung von Regex, wenn Sie nicht den Anfang des Zeichenfolge Zeichen "^" (Caret/Zirkumflex) und/oder Ende des Zeichenfolge Zeichen "$" (Dollar) dann unerwartetes/nicht intuitives Verhalten erhalten (wie "gestern" oder "warum").

Gruppierungszeichen "()" (runde Klammern) um die Optionen zu setzen, reduziert die Notwendigkeit, Anfang und Ende von Zeichenfolgen für jede Option zu setzen. Ohne sie erhalten Sie möglicherweise unerwartetes Verhalten, wenn Sie mit Regex nicht vertraut sind. Wenn Sie keine Benutzereingaben, sondern einige bekannte Zeichenfolgen verarbeiten, ist es natürlich besser lesbar, wenn Sie nicht gruppieren und Zeichenfolgen beginnen und enden.

Verwandte Themen