डॉस बैच में तार्किक ऑपरेटर ("और", "या")


251

आप डॉस बैच फ़ाइलों में तार्किक ऑपरेटरों को कैसे लागू करेंगे?


6
मैं आपके देखने की खुशी के लिए प्रस्तुत करता हूं: pi.bat :) thedailywtf.com/Articles/…
स्कॉट एंडरसन

जवाबों:


289

आप andनेस्टेड शर्तों के साथ कर सकते हैं:

if %age% geq 2 (
    if %age% leq 12 (
        set class=child
    )
)

या:

if %age% geq 2 if %age% leq 12 set class=child

आप orएक अलग चर के साथ कर सकते हैं :

set res=F
if %hour% leq 6 set res=T
if %hour% geq 22 set res=T
if "%res%"=="T" (
    set state=asleep
)

14
आप बस टाइपो का उपयोग कर सकते हैं set res=या set res=1फिर if defined resटाइपो के खिलाफ थोड़ा अधिक मजबूत हो सकते हैं और ब्लॉक में भी काम कर सकते हैं जो स्पष्ट रूप से विलंबित विस्तार को सक्षम किए बिना।
जॉय

5
बस अपने उत्तर को थोड़ा सुधारने के लिए ... आपको "अगर" बयानों को स्पष्ट रूप से घोंसला बनाने की आवश्यकता नहीं है ... आप उन्हें सिर्फ "चेन" कर सकते हैं, जैसा कि डेव जार्विस नीचे प्रदर्शित करते हैं
जोएलफान

सेट के बाद किसी भी स्थान को छोड़ने के लिए न देखें = सच या सिर्फ इनायत से काम नहीं होता है। यह वैरिएबल में "ट्रू" वैल्यू को स्टोर करेगा ...
रोलैंड पिहलाकास

1
आपके द्वारा वर्णित 'या' स्थिति स्लीक है और संख्याओं की श्रेणी के लिए बहुत बढ़िया है, लेकिन क्या होगा यदि मैं 2 स्वतंत्र मूल्यों की तुलना कर रहा हूं, और एक सीमा नहीं? उदाहरण के लिए, यदि यह फ़ाइल मौजूद है या फ़ाइल नाम == ""
bakoyaro

1
@ बकोयारो, आप किसी भी शर्त का उपयोग कर सकते हैं, जो आपके द्वारा उल्लिखित है, को सही पर सेट करने के लिए।
पैक्सडिब्लो

69

IFबयान तार्किक ऑपरेटरों का समर्थन नहीं करता ( ANDऔर OR), व्यापक IFबयान एक अंतर्निहित संयोजन बनाते हैं।

IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL

अगर File1.Dat और File1.Dat मौजूद है तो लेबल को जंप करें FILE12_EXIST_LABEL

यह सभी देखें: IF /?


53

डी मॉर्गन के नियम हमें केवल संयोजन ("और") और नकारात्मक ("नहीं") का उपयोग करके असमानता ("या") को तार्किक समकक्षों में बदलने की अनुमति देते हैं। इसका मतलब है कि हम एक लाइन पर असमानता ("ओआर") को चेन कर सकते हैं।

इसका मतलब है अगर नाम "याकोको" या "वाको" या "डॉट" है, तो "वार्नर भाई या बहन" की प्रतिध्वनि करें।

set warner=true
if not "%name%"=="Yakko" if not "%name%"=="Wakko" if not "%name%"=="Dot" set warner=false
if "%warner%"=="true" echo Warner brother or sister

यह paxdiablo के "OR" उदाहरण का एक और संस्करण है, लेकिन शर्तों को एक पंक्ति में जंजीर किया गया है। (ध्यान दें कि इसके विपरीत leqहै gtr, और इसके विपरीत geqहै lss।)

set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep

6

निम्न उदाहरण दिखाते हैं कि एक AND कथन कैसे बनाया जाता है (चर के लिए या कमांड के लिए पैरामीटर सहित)।

नोटपैड शुरू करने और CMD विंडो बंद करने के लिए:

start notepad.exe & exit

यदि चर 'a' के बराबर होता है, तो चर x, y और z सेट करने के लिए।

IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)

उम्मीद है की वो मदद करदे!


5

या थोड़ा मुश्किल है, लेकिन ऐसा नहीं है। यहाँ एक उदाहरण है

set var1=%~1
set var2=%~2
::
set or_=
if "%var1%"=="Stack" set or_=true
if "%var2%"=="Overflow" set or_=true
if defined or_ echo Stack OR Overflow

2

आईएफएस स्टेटमेंट्स में शर्तों को नकारते हुए या फिर ईएलएसई क्लॉज का उपयोग करते हुए कोड डालने के लिए स्थान के रूप में ईएलएसई क्लॉज का उपयोग करके ओआरएस टेस्ट कैसे लागू किया जाए, इसके लिए एक तार्किक विचार दिया। मैंने अपने आप से सोचा था कि हालांकि दो IF स्टेटमेंट का उपयोग करने का सुझाव देने के बाद से आमतौर पर दो और क्लॉज़ हैं, और इसलिए निष्पादित कोड को दो बार लिखने की आवश्यकता है । हालाँकि, अगर GOTO का उपयोग आवश्यक कोड को छोड़ने के लिए किया जाता है, तो लिखने के बजाय ELSE निष्पादन के लिए कोड को क्लॉस करता है, केवल एक बार लिखने की आवश्यकता होती है ।

यहाँ कैसे मैं एक बनाने के लिए Athul प्रकाश की नकारात्मक तर्क लागू होगा की एक परीक्षण योग्य उदाहरण है या

मेरे उदाहरण में, किसी को टैंक चलाने की अनुमति है यदि उनके पास टैंक लाइसेंस है या वे अपनी सैन्य सेवा कर रहे हैं । दो संकेतों पर सही या गलत दर्ज करें और आप यह देख पाएंगे कि क्या तर्क आपको टैंक चलाने की अनुमति देता है।

@ECHO OFF
@SET /p tanklicence=tanklicence:
@SET /p militaryservice=militaryservice:

IF /I NOT %tanklicence%==true IF /I NOT %militaryservice%==true GOTO done

ECHO I am driving a tank with tanklicence set to %tanklicence% and militaryservice set to %militaryservice%

:done

PAUSE

2

यदि आपको एक कथन में if+ AND/ लिखने की रुचि है OR, तो इसमें से कोई भी नहीं है। लेकिन, आप अभी भी / और / बयानों के ifसाथ समूह बना सकते हैं कि आप एक लाइन w / o में कोई अतिरिक्त चर चाहते हैं और w / o ब्लॉक दोहराव (एकल और कोड अनुभागों के लिए कमांड ):&&||()if-elseechoTRUEFALSE

@echo off

setlocal

set "A=1" & set "B=2" & call :IF_AND
set "A=1" & set "B=3" & call :IF_AND
set "A=2" & set "B=2" & call :IF_AND
set "A=2" & set "B=3" & call :IF_AND

echo.

set "A=1" & set "B=2" & call :IF_OR
set "A=1" & set "B=3" & call :IF_OR
set "A=2" & set "B=2" & call :IF_OR
set "A=2" & set "B=3" & call :IF_OR

exit /b 0

:IF_OR
( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) || ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) || ( echo.FALSE-& type 2>nul ) ) && echo TRUE+

exit /b 0

:IF_AND
( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) && ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) && echo.TRUE+ ) || echo.FALSE-


exit /b 0

आउटपुट :

TRUE+
FALSE-
FALSE-
FALSE-

TRUE+
TRUE+
TRUE+
FALSE-

चाल typeकमांड में है जो ड्रॉप / सेट करता है errorlevelऔर इसलिए अगले कमांड का रास्ता संभालता है।


1

नकार ऑपरेंड की कोशिश करें - 'नहीं'!

यदि आप नेस्टेड (यदि पिछले उत्तरों को देखें) का उपयोग करते हुए, यदि आप एक बयान पर 'और' ऑपरेशन कर सकते हैं, तो आप एक 'या' ऑपरेशन करने के लिए 'नहीं' के साथ एक ही काम कर सकते हैं।

यदि आपको अभी तक विचार नहीं मिला है, तो पढ़ें। अन्यथा, बस अपना समय बर्बाद मत करो और प्रोग्रामिंग में वापस जाओ।

जैसे नेस्टेड 'यदि सभी शर्तों के सत्य होने पर ही संतुष्ट हों, तो नेस्टेड' यदि सभी शर्तों के झूठे होने पर ही संतुष्ट न हों। यह एक 'या' ऑपरेंड के साथ आप क्या करना चाहते हैं, ऐसा ही है न?

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

और अगर आपको अभी भी इस बात का पता नहीं चला है, तो माफ कीजिए, मैं 16 साल का हूं और यही सबसे अच्छा है जिसे मैं समझा सकता हूं।


x = 2 या x = 3 =>! ! (x = 2 या x = 3) =>! (x! = 2 और x! = 3) मुझे नहीं लगता कि आप आवश्यक बाहरी "न" ऑपरेटर को लागू करने के लिए संरचना को पूरी तरह से नकार सकते हैं। 3 साल हो गए, @ अथुल-प्रकाश, विचार?
अजरोथ

1

यह निम्नलिखित के रूप में आसान है:

और> अगर + अगर

if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something*

या> अगर // अगर

set BOTH=0
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" set BOTH=1
if "%BOTH%"=="0" if "%VAR1%"=="VALUE" *do something*
if "%BOTH%"=="0" if "%VAR2%"=="VALUE" *do something*

मुझे पता है कि अन्य उत्तर भी हैं, लेकिन मुझे लगता है कि खदान अधिक सरल है, इसलिए समझना अधिक आसान है। आशा है कि यह आपकी मदद करता है! ;)


0

एक विकल्प एक यूनिक्स खोल की तलाश है जो आपको तार्किक ऑपरेटर और पूरे बहुत कुछ देता है। यदि आप साइबरविन मार्ग पर नहीं जाना चाहते हैं तो आप यहां बॉर्न शेल का एक देशी win32 कार्यान्वयन प्राप्त कर सकते हैं । यहां देशी कट्टा मिल सकता है । मुझे पूरा यकीन है कि आप आसानी से अन्य अच्छे विकल्प जैसे कि zsh या tsh को google कर सकते हैं।


4
यदि आप एक अलग शेल का उपयोग करने के प्रयास से गुजर रहे हैं, तो कम से कम PowerShell के साथ जाएं: microsoft.com/powershell
ग्रहण

17
डॉस की तुलना में कई बेहतर गोले हैं। DOS बैट फ़ाइल का उपयोग करने का कारण यह है कि इसके लिए किसी बाहरी उपकरण की आवश्यकता नहीं है। यदि आपके पास एक ग्राहक है जिसे कुछ सरल करने की आवश्यकता है, तो क्या आप वास्तव में चाहते हैं कि जब कोई BAT फाइल पर्याप्त होगी, तो उन्हें विशेष उपकरण (साइबरविन, पर्ल, पॉवरशेल, आदि) स्थापित करने होंगे?
मार्क लकाटा

3
बैट ज्यादातर समय पर्याप्त होता है। 90% यूनिक्स शेल स्क्रिप्ट पीपीएल राइट शुद्ध शेल नहीं है, बल्कि कई कोर्यूटिल्स, सेड, ऑक आदि कॉल के साथ है। GNU ने विंडोज सहित अन्य OS में UNIX अच्छाइयों को लागू किया है। तो इस getgnuwin32.sourceforge.net cmd.exe / bash / zsh प्लस पर एक नज़र डालें और यह अधिकांश कार्यों पर पर्याप्त होना चाहिए। BAT / UNIX शेल अनुभव होने पर
तथाकथित पॉवरशेल

0

केवल ओआर हिस्सा ही मुश्किल है, लेकिन एक सामान्य बूलियन अभिव्यक्ति के साथ, जिसमें OR या एकमात्र अच्छा समाधान नहीं है, यह है:

REM if A == B OR C == C then yes

(call :strequ A B || call :strequ C C) && echo yes
exit /b

:strequ
if "%1" == "%2" exit /b 0
exit /b 1

-1

एंड्री के जवाब के लिए थोड़ा संशोधन, डुप्लिकेट प्रकार के आदेशों को कम करना:

set "A=1" & set "B=2" & call :IF_AND
set "A=1" & set "B=3" & call :IF_AND
set "A=2" & set "B=2" & call :IF_AND
set "A=2" & set "B=3" & call :IF_AND

echo.

set "A=1" & set "B=2" & call :IF_OR
set "A=1" & set "B=3" & call :IF_OR
set "A=2" & set "B=2" & call :IF_OR
set "A=2" & set "B=3" & call :IF_OR

goto :eof

:IF_OR

(if /i not %A% EQU 1 (
   if /i not %B% EQU 2 (
      echo FALSE-
      type 2>nul
   )
)) && echo TRUE+

goto :eof

:IF_AND


(if /i %A% EQU 1 (
   if /i %B% EQU 2 (
      echo TRUE+
      type 2>nul
   )
)) && echo FALSE-

goto :eof
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.