2011-05-19 21 views
23

वहाँ एक बैच फ़ाइल मेंविंडोज बैच फ़ाइलें: अनेक शर्तें

 
if %1 == 1 or %1 == 2 

की तरह कुछ कहने के लिए एक रास्ता है तो क्या होगा? या, और भी बेहतर है, अगर मैं उम्मीदवार मानों का एक सेट की तरह

 
if %1 in [1, 2, 3, 4, ... 20] 
+0

सटीक डुप्लिकेट: http://stackoverflow.com/questions/2772180/cmd-exe-complex-conditions –

+0

तो मुझे लगता है कि यह संभव नहीं है? – MxyL

+0

जहाँ तक मुझे पता है कि यह नहीं है। –

उत्तर

22

एक तरीका यह निर्दिष्ट कर सकते हैं लागू करने के लिए तार्किक-या कि goto एक ही लेबल एकाधिक सशर्त, उपयोग करने के लिए है।

if %1 == 1 goto :cond 
if %1 == 2 goto :cond 
goto :skip 
:cond 
someCommand 
:skip 

सेट सदस्यता के लिए परीक्षण करने के लिए, आप इस्तेमाल कर सकते हैं एक के लिए लूप:

for %%i in (1 2 3 4 ... 20) do if %1 == %%i someCommand 

ध्यान दें कि == स्ट्रिंग समानता ऑपरेटर है। equ संख्यात्मक समानता ऑपरेटर है।

+0

@ जॉय: वे आम तौर पर समान कार्य करते हैं, लेकिन हमेशा नहीं: 'अगर 5 equ 05 echo yes' प्रिंट्स "हां" लेकिन 'अगर 5 == 05 गूंज हां नहीं है। – bk1e

+0

आह, अग्रणी शून्य।उन 9 0 9 0 'के साथ विफल रहता है क्योंकि यह उन्हें ऑक्टल के रूप में व्याख्या करने की कोशिश करता है। प्रारंभिक टिप्पणी को कभी न मानें, फिर :-) – Joey

9

मुझे पता है कि यह पुराना है, लेकिन मैं बस आपको यह बताने के लिए चाहता था कि पिछली पोस्टों के विपरीत यह वास्तव में संभव है। असल में आप दो IF कमांड को एक में जोड़ रहे हैं।

सिंटेक्स: IF equation (cmd if true)else command if false

दो चर के लिए यह प्रयास एक चर (प्रदर्शन करने के लिए या स्टेटमेंट ध्यान दें कि आप के रूप में एक से अधिक चर का उपयोग कर सकते हैं के साथ (xx और XX बयान यदि प्रदर्शन करने के लिए)

set varone=1 
set vartwo=2 

if %varone% equ 1 (if %vartwo% equ 2 (echo TRUE)else echo FALSE)else echo FALSE 

अच्छी तरह से)

if %a% equ 1 (echo pass)else if %a equ 2 (echo pass)else echo false 

आप इको पास स्थानापन्न कर सकते हैं/अपने आदेश के साथ विफल

+0

ने अभी यह देखा है। यह जानना अच्छा है कि ऐसा करने का एक तरीका है (और अन्य उपयोगों का कारण बन सकता है), लेकिन सिंटैक्स इसे वास्तव में अव्यवस्थित दिखता है! उम्मीदवार मूल्यों के एक सेट पर लूप के लिए इस मामले में क्लीनर होगा। – MxyL

21

"और" आसान हो जाता है - बस सिंटैक्स की अपेक्षा नहीं है: ये 3 उदाहरण इसे चित्रित करते हैं।

शब्दों में: यदि 1 == 1 और 2 == 2 फिर गूंज "हैलो"

if 1==1 echo hello 
hello 

if 1==1 if 2==2 echo hello 
hello 

if 1==1 if 2==1 echo hello 
(nothing was echoed) 
+0

यह असली जवाब है। 'गोटो 'का उपयोग करना सबसे अच्छा –

0

थोड़ा खेल में देर से, लेकिन फिर भी यह करता है, तो यह सोचते हैं सवाल पर ठोकर किसी को भी मदद कर सकता है। ,

(echo ":1: :2:" | findstr /i ":%1:" 1>nul 2>nul) && (
    echo Input is either 1 or 2 
) 

findstr के बाद से एक बाहरी कमांड है मैं एक पाश जो पुनरावृत्तियों के 1000 के माध्यम से जा सकते हैं अंदर यह प्रयोग नहीं कर सुझाव देते हैं: जिस तरह से मैं यह कर इस तरह से उपयोग कर रहा है गूंज का एक संयोजन findstr को पहुंचाया। यदि ऐसा नहीं है, तो यह एकाधिक Is का उपयोग करने के बजाय आप जो करने का प्रयास कर रहे हैं उसे हल करना चाहिए। इसके अलावा, ":" की पसंद में कुछ खास नहीं है, बस एक डेलीमीटर का उपयोग करें जो% 1 में मान का हिस्सा होने की संभावना नहीं है।

अन्य लोगों को धन्यवाद, जो कि एक ही लिंक के समान इंगित करने के लिए धन्यवाद, मैं इस प्रतिक्रिया को भी पोस्ट कर दूंगा, अगर कोई उस प्रश्न पर ठोकर खाए और यहां तक ​​कि यहां तक ​​पहुंच न जाए।

+0

पर एक हैक होगा क्या यह समाधान बड़ी मात्रा में वैध तत्वों (उदाहरण के लिए: एक्सटेंशन की एक सूची) के लिए स्केलेबल होगा – MxyL

+0

@ किइकोकू: बस इतना है कि मैं बेहतर समझता हूं, उदाहरण के लिए, स्थिति में उल्लिखित स्थिति में ऊपर मूल प्रश्न, क्या आप इनपुट की तलाश में हैं जो 1, 2, 3, ... हो सकता है (इतनी बड़ी संख्या तक)? यह उस मामले में व्यवहार्य नहीं होगा। लेकिन निश्चित रूप से हम फिट करने के लिए बेहतर तरीका तलाश सकते हैं। आपकी स्थिति का एक संक्षिप्त विवरण मदद कर सकता है - यदि आप पहले से ही उठा चुके हैं, तो आप अपने प्रश्न के लिए एक लिंक प्रदान कर सकते हैं। – Arun

+0

मुझे उस समस्या को याद नहीं है जब मैं प्रश्न खोला गया था। मुझे लगता है कि किसी बिंदु पर मैं यह जांचना चाहता था कि इनपुट के अनुसार इनपुट क्या था और कुछ किया (और मेरे पास एक्सई या बैच फ़ाइल लिखने के बीच विकल्प था) – MxyL

संबंधित मुद्दे