2010-08-16 43 views

回答

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

也可以做'{$ _ -in「y」,「yes」}''但我不確定自哪個PS版本。 – tkokasih 2014-04-29 21:57:10

+2

@wannabeprogrammer [在Windows PowerShell 3.0中引入了** In **運算符。](https://technet.microsoft.com/zh-cn/library/hh847759.aspx) – 2015-05-19 12:28:57

+3

-eq在執行字符串比較時不區分大小寫所以ToLower不是必需的 – 2016-04-14 15:34:04

33

您應該能夠使用通配符爲你的價值觀:

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

正則表達式也是允許的。

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

Powershell的開關文檔:http://technet.microsoft.com/en-us/library/ff730937.aspx

+1

這是一個很好的解決方案,雖然「技術上」,因爲我要求使用單獨的值,我已經標記fletcher作爲答案。 – Micah 2010-08-16 14:41:12

+2

不夠公平,儘管不同的正則表達式可能會做同樣的事情。 – derekerdmann 2010-08-16 14:48:51

+2

正則表達式的方法會更簡潔。 – mseery 2010-08-30 03:25:02

4

支持輸入y |你們|是不區分大小寫。

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

實際上,您的表達式「[yes]」匹配$ someString中任意位置的字符「y」,「e」或「s」。即使$ someString是「no!no!no!s」,switch塊將返回「You entered Yes」。因爲尾隨的's'。 匹配y | ye |是表達式應該是「^ y(es?)?$」。 – BACON 2011-05-24 17:58:22

36

我知道這是一個古老的線程,但我發現這工作,似乎更具可讀性:

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

的「-contains」運算符執行不區分大小寫的搜索,所以你不」不需要使用「ToLower()」。如果您確實希望區分大小寫,則可以使用「-ccontains」。

-2

在搜索解決方案以找到和您一樣的問題後,我在這裏找到了這個小題目。事先我得到這個開關更流暢的解決方案,case語句

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

{'y' - 或'是'}總是評估爲true,因此默認分支從未被擊中 – 2015-07-15 23:27:27

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

您可以任意分支,級聯,併爲目標的情況下位於下方以這種方式合併的情況下,只要/後分別重新分配$ _變量的情況。


n.b.就像這種行爲一樣可愛,它似乎揭示了PowerShell解釋器沒有按照人們希望或假設的那樣有效地實現開關/外殼。首先,使用ISE調試器進行調試,表明不是優化查找,散列或二進制分支,而是依次測試每個案例,就像很多if-else語句一樣。 (如果是這樣,請考慮先將最常見的案例放在第一位。)此外,如本答案所示,PowerShell在滿足測試案例後繼續測試案例。而且殘酷的是,它甚至恰好是.NET CIL中特別優化的「開關」操作碼,由於這種行爲,PowerShell無法利用。

+0

這不可愛 - 它被記錄在案。如果您不希望後續分支評估,請添加一個break語句。 – Frank 2017-05-07 00:13:33

+1

@Frank從「C」(1975)或更早版本以來,「可愛」可能不是用於指代對其歷史語義在多種語言中被改變或非典型的關鍵詞行爲的最佳詞。 – 2017-05-11 02:19:46

1

使用正則表達式的交替操作符「|」(管道)對derekerdmann的帖子進行輕微修改以滿足原始請求。

正則表達式新手理解和閱讀也稍微容易一些。請注意,如果您不使用字符串字符「^」(caret/circumflex)和/或字符串結尾字符「$」(美元)的起始字符,那麼您可能會收到意想不到的/不直觀的行爲(比如匹配「昨天」或「爲什麼」)。

在選項周圍放置分組字符「()」(括號)可以減少爲每個選項放置字符串字符的開始和結束的需要。如果沒有他們,如果你不懂正則表達式,你會得到意想不到的行爲。當然,如果你不處理用戶輸入,而是處理一些已知字符串,它將更易於閱讀,而不需要分組和開始和結束字符串。

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