2010-08-16 4 views

उत्तर

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

'{$ _ -in" y "," yes "} भी कर सकता है, लेकिन मुझे यकीन नहीं है कि कौन सा पीएस संस्करण है। – tkokasih

+2

@ वानाबेप्रोग्रामर [** ** ** ऑपरेटर विंडोज पावरशेल 3.0 में पेश किया गया था।] (Https://technet.microsoft.com/en-us/library/hh847759.aspx) –

+3

-ईक स्ट्रिंग तुलना करने पर केस असंवेदनशील है इसलिए ToLower की आवश्यकता नहीं है –

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

यह एक अच्छा समाधान है, हालांकि "तकनीकी रूप से" जब से मैं अलग-अलग मानों का उपयोग करने के लिए कह रहा था, मैंने फ्लेचर को जवाब के रूप में चिह्नित किया है। – Micah

+2

पर्याप्त मेला, हालांकि एक अलग नियमित अभिव्यक्ति शायद वही काम कर सकती है। – derekerdmann

+2

रेगेक्स दृष्टिकोण अधिक संक्षिप्त होगा। – mseery

4

y में प्रवेश का समर्थन करता है | तु | हाँ और केस संवेदी।

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

दरअसल, आपकी अभिव्यक्ति "[yes]" कुछ स्ट्रिंग में कहीं भी 'y', 'e', ​​या 's' वर्णों की किसी भी घटना से मेल खाती है। भले ही $ someString "नहीं! नहीं! नहीं!" है कि ब्लॉक ब्लॉक वापस आ जाएगा "आपने हाँ दर्ज किया है।" पीछे की ओर की वजह से। वाई से मेल करने के लिए | हाँ | हाँ अभिव्यक्ति "^ y (es?)? $" होनी चाहिए। – BACON

36

मैं जानता हूँ कि यह एक पुरानी धागा है, लेकिन मैंने पाया कि यह काम करता है और अधिक पठनीय लगता है:,

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

"-contains" ऑपरेटर एक गैर केस संवेदी खोज करता है, ताकि आप डॉन ' "ToLower()" का उपयोग करने की आवश्यकता नहीं है। यदि आप चाहते हैं कि यह केस संवेदनशील हो, तो आप इसके बजाय "-कॉन्टेन" का उपयोग कर सकते हैं।

-2

आपके जैसी ही समस्या के समाधान खोजने के बाद, मुझे यह छोटा विषय यहां मिला है। अग्रिम में मैं इस परिवर्तन के लिए अधिक सहज समाधान है, मामले बयान

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

{'y' -or 'yes'} हमेशा सत्य का मूल्यांकन करता है ताकि डिफ़ॉल्ट शाखा कभी भी –

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

आप मनमाने ढंग से, शाखा कर सकते हैं झरना है, और इस फैशन में मामलों विलय, जब तक लक्ष्य मामले के नीचे स्थित है मिल गया/के बाद केस या मामले जहां $ _ चर को क्रमशः पुन: असाइन किया गया है।


एनबी। जैसा कि इस व्यवहार के रूप में प्यारा है, ऐसा लगता है कि पावरशेल दुभाषिया स्विच/केस को कुशलतापूर्वक कार्यान्वित नहीं कर रहा है क्योंकि कोई उम्मीद कर सकता है या अनुमान लगा सकता है। एक के लिए, आईएसई डीबगर के साथ कदम उठाने से पता चलता है कि ऑप्टिमाइज्ड लुकअप, हैशिंग, या बाइनरी ब्रांचिंग के बजाय, प्रत्येक मामले को बदले में परीक्षण किया जाता है, जैसे कि कई अन्य कथन। (यदि हां, तो सबसे पहले अपने सबसे आम मामलों को डालने पर विचार करें।) इसके अलावा, जैसा कि इस उत्तर में दिखाया गया है, PowerShell संतुष्ट होने के बाद परीक्षण मामलों को जारी रखता है। और क्रूर रूप से पर्याप्त, एनईटी सीआईएल में उपलब्ध एक विशेष अनुकूलित 'स्विच' ओपोड भी होता है, जो इस व्यवहार के कारण, पावरशेल का लाभ नहीं उठा सकता है।

+0

हिट न हो। यह प्यारा नहीं है - यह दस्तावेज है। यदि आप बाद की शाखाओं का मूल्यांकन नहीं करना चाहते हैं तो एक ब्रेक स्टेटमेंट जोड़ें। – Frank

+1

@ फ्रैंक फेयर पर्याप्त, "प्यारा" किसी कीवर्ड व्यवहार का जिक्र करने के लिए सबसे अच्छा शब्द नहीं हो सकता है जो 'सी' (1 9 75) या इससे पहले की कई भाषाओं में अपने ऐतिहासिक अर्थशास्त्र के विपरीत बदल गया है या अचूक है। –

1

रेगेक्स के वैकल्पिक ऑपरेटर "|" (पाइप) का उपयोग करके मूल अनुरोध को पूरा करने के लिए डेरेकरडमैन के पोस्ट में मामूली संशोधन।

रेगेक्स न्यूबीज को समझने और पढ़ने के लिए यह थोड़ा आसान है।

ध्यान दें कि रेगेक्स का उपयोग करते समय, यदि आप स्ट्रिंग वर्ण "^" (कैरेट/circumflex) और/या स्ट्रिंग वर्ण "$" (डॉलर) के अंत की शुरुआत नहीं करते हैं तो आपको अप्रत्याशित/अनजान व्यवहार मिल सकता है (जैसे "कल" ​​या "क्यों" मिलान करना)।

विकल्पों के चारों ओर समूहबद्ध वर्ण "()" (कोष्ठक) डालकर प्रत्येक विकल्प के लिए स्ट्रिंग वर्णों की शुरुआत और अंत को रखने की आवश्यकता कम हो जाती है। उनके बिना, यदि आप regex के साथ समझदार नहीं हैं, तो आप संभवतः अप्रत्याशित व्यवहार प्राप्त करेंगे। बेशक, यदि आप उपयोगकर्ता इनपुट को संसाधित नहीं कर रहे हैं, बल्कि ज्ञात तारों के कुछ सेट हैं, तो यह स्ट्रिंग वर्णों के समूहकरण और प्रारंभ और अंत के बिना अधिक पठनीय होगा।

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." } 
} 
संबंधित मुद्दे