क्या विंडोज़ बैच-फ़ाइल में IF या IF सशर्त विवरण लिखने का कोई तरीका है?
उदाहरण के लिए:
IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE
क्या विंडोज़ बैच-फ़ाइल में IF या IF सशर्त विवरण लिखने का कोई तरीका है?
उदाहरण के लिए:
IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE
जवाबों:
ज़ंबूक समाधान अच्छा है, लेकिन सभी स्थितियों में उपयोग नहीं किया जा सकता है, जैसे कि FOR DO (...) लूप जैसे कोड के ब्लॉक के अंदर।
एक विकल्प एक संकेतक चर का उपयोग करना है। इसे अपरिभाषित करने के लिए प्रारंभ करें, और फिर इसे केवल तभी परिभाषित करें जब OR में से कोई भी एक सत्य हो। उसके बाद IF DEFINED का उपयोग अंतिम परीक्षण के रूप में करें - विलंबित विस्तार का उपयोग करने की कोई आवश्यकता नहीं है।
FOR ..... DO (
set "TRUE="
IF cond1 set TRUE=1
IF cond2 set TRUE=1
IF defined TRUE (
...
) else (
...
)
)
आप ELSE IF तर्क जोड़ सकते हैं जो कि arasmussen इस आधार पर उपयोग करता है कि यह 1 की स्थिति सच होने पर तेजी से मूत सकता है, लेकिन मैं कभी परेशान नहीं होता।
परिशिष्ट - यह एक IF स्टेटमेंट WinXP बैच स्क्रिप्ट में OR का उपयोग करने के लगभग समान उत्तरों के साथ एक डुप्लिकेट प्रश्न है
अंतिम परिशिष्ट - मैं परीक्षण करने के लिए अपनी पसंदीदा तकनीक को लगभग भूल गया अगर एक चर मामले की असंवेदनशील मूल्यों की सूची में से कोई एक है। स्वीकार्य मानों की सीमांकित सूची वाले परीक्षण चर को आरम्भ करें, और फिर खोज का उपयोग करके परीक्षण करें कि आपका चर सूची के भीतर है या नहीं। यह बहुत तेज़ है और मनमाने ढंग से लंबी सूची के लिए न्यूनतम कोड का उपयोग करता है। इसमें विलंबित विस्तार की आवश्यकता होती है (या फिर कॉल%% VAR %% चाल)। साथ ही परीक्षण CASE INSENSITIVE है।
set "TEST=;val1;val2;val3;val4;val5;"
if "!TEST:;%VAR%;=!" neq "!TEST!" (echo true) else (echo false)
यदि VAR सम्मिलित है =
, तो उपरोक्त विफल हो सकता है , इसलिए परीक्षण मूर्खतापूर्ण नहीं है।
यदि किसी ब्लॉक के भीतर परीक्षण करना जहां VAR के वर्तमान मूल्य तक पहुंचने के लिए विलंबित विस्तार की आवश्यकता होती है
for ... do (
set "TEST=;val1;val2;val3;val4;val5;"
for /f %%A in (";!VAR!;") do if "!TEST:%%A=!" neq "!TEST!" (echo true) else (echo false)
)
VAR के भीतर अपेक्षित मूल्यों के आधार पर "delims =" जैसे विकल्पों की आवश्यकता हो सकती है
उपरोक्त रणनीति को =
थोड़ा और कोड जोड़कर VAR में भी विश्वसनीय बनाया जा सकता है ।
set "TEST=;val1;val2;val3;val4;val5;"
if "!TEST:;%VAR%;=!" neq "!TEST!" if "!TEST:;%VAR%;=;%VAR%;"=="!TEST!" echo true
लेकिन अब हम ईएलएसई खंड प्रदान करने की क्षमता खो चुके हैं जब तक कि हम एक संकेतक चर नहीं जोड़ते। कोड थोड़ा "बदसूरत" दिखना शुरू हो गया है, लेकिन मुझे लगता है कि यह परीक्षण के लिए सबसे अच्छा प्रदर्शन करने वाला विश्वसनीय तरीका है अगर VAR केस-असंवेदनशील विकल्पों में से किसी एक की मनमानी संख्या है।
अंत में एक सरल संस्करण है जो मुझे लगता है कि थोड़ा धीमा है क्योंकि यह प्रत्येक मान के लिए एक IF प्रदर्शन करना होगा। Aacini ने पहले दिए गए लिंक में स्वीकृत उत्तर के लिए एक टिप्पणी में यह समाधान प्रदान किया
for %%A in ("val1" "val2" "val3" "val4" "val5") do if "%VAR%"==%%A echo true
मूल्यों की सूची में * या शामिल नहीं हो सकता है? वर्ण, और मान और %VAR%
उद्धरण शामिल नहीं होने चाहिए। उद्धरण समस्याओं की ओर ले जाता है अगर %VAR%
इसमें रिक्त स्थान या विशेष वर्ण भी शामिल हैं ^
, &
आदि। इस समाधान के साथ एक अन्य सीमा यह है कि यह एक ELSE खंड के लिए विकल्प प्रदान नहीं करता है जब तक कि आप एक संकेतक चर नहीं जोड़ते हैं। लाभ यह है कि आईएफ /I
विकल्प की उपस्थिति या अनुपस्थिति के आधार पर यह संवेदनशील या असंवेदनशील हो सकता है ।
मुझे ऐसा नहीं लगता। बस दो आईएफएस और एक ही लेबल का उपयोग करें:
IF cond1 GOTO foundit
IF cond2 GOTO foundit
ECHO Didn't found it
GOTO end
:foundit
ECHO Found it!
:end
ECHO Didn't find it
इसे ढूंढने पर भी इसे मारेंगे।
इस पोस्ट के लिए धन्यवाद, इसने मेरी बहुत मदद की।
डननो अगर यह मदद कर सकता है, लेकिन मेरे पास मुद्दा था और आपके लिए धन्यवाद, मैंने पाया कि मुझे लगता है कि इस बूलियन तुल्यता के आधार पर इसे हल करने का एक और तरीका है:
"ए या बी" "नहीं (ए और बी नहीं)" के समान है।
इस प्रकार:
IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE
हो जाता है:
IF not [%var%] == [1] IF not [%var%] == [2] ECHO FALSE
एक "या" स्थिति का उपयोग करने के लिए एक सरल "फॉर" का उपयोग एक पंक्ति में किया जा सकता है:
FOR %%a in (item1 item2 ...) DO IF {condition_involving_%%a} {execute_command}
आपके मामले में लागू:
FOR %%a in (1 2) DO IF %var%==%%a ECHO TRUE
भले ही यह सवाल थोड़ा पुराना हो:
यदि आप उपयोग करना चाहते हैं if cond1 or cond 2
- तो आपको जटिल लूप या सामान का उपयोग नहीं करना चाहिए।
सरल दोनों ifs
एक दूसरे के साथ संयुक्त प्रदान करते हैं goto
- यह एक अंतर्निहित या है।
//thats an implicit IF cond1 OR cond2 OR cond3
if cond1 GOTO doit
if cond2 GOTO doit
if cond3 GOTO doit
//thats our else.
GOTO end
:doit
echo "doing it"
:end
गोटो के बिना लेकिन "इनहेल्ड" एक्शन होने पर, आप एक्शन को 3 बार निष्पादित कर सकते हैं, यदि सभी स्थितियाँ मेल खा रही हों।
कोई है IF <arg> OR
या ELIF
या ELSE IF
बैच में, फिर भी ...
पिछले IF के ELSE के अंदर अन्य IF के घोंसले के शिकार की कोशिश करें।
IF <arg> (
....
) ELSE (
IF <arg> (
......
) ELSE (
IF <arg> (
....
) ELSE (
)
)
किसी फ़ंक्शन का उपयोग करना संभव है, जो OR लॉजिक का मूल्यांकन करता है और एकल मान लौटाता है।
@echo off
set var1=3
set var2=5
call :logic_or orResult "'%var1%'=='4'" "'%var2%'=='5'"
if %orResult%==1 (
echo At least one expression is true
) ELSE echo All expressions are false
exit /b
:logic_or <resultVar> expression1 [[expr2] ... expr-n]
SETLOCAL
set "logic_or.result=0"
set "logic_or.resultVar=%~1"
:logic_or_loop
if "%~2"=="" goto :logic_or_end
if %~2 set "logic_or.result=1"
SHIFT
goto :logic_or_loop
:logic_or_end
(
ENDLOCAL
set "%logic_or.resultVar%=%logic_or.result%"
exit /b
)
&& ... || ...
अतिरिक्त IF ... ELSE ...
कथन के बजाय सीधे सुविधाजनक सिंटैक्स का उपयोग कर सकता है ।
परोक्ष रूप से IFs का उपयोग करके लक्ष्य प्राप्त किया जा सकता है।
नीचे एक जटिल अभिव्यक्ति का उदाहरण दिया गया है, जो गुप्त और तार्किक रूप से बिना सीएमडी बैच में गुप्त और तार्किक रूप से लिखा जा सकता है।
के बीच कोड ब्लॉक () कोष्ठक सीएमडी द्वारा एक (दयनीय) प्रकार के उपधारा के रूप में संभाला जाता है। ब्लॉक से बाहर आने वाला जो भी कोड होता है, उसका उपयोग सही / गलत मूल्य निर्धारित करने के लिए किया जाएगा, जो ब्लॉक बूलियन अभिव्यक्ति में निभाता है। इन कोड ब्लॉक के साथ बहुत बड़े बूलियन एक्सप्रेशन बनाए जा सकते हैं।
सरल उदाहरण है
प्रत्येक ब्लॉक को सही (यानी ERRORLEVEL = 0 के बाद ब्लॉक में अंतिम विवरण निष्पादित होने के बाद) हल किया गया है / गलत है, जब तक कि पूरे एक्सप्रेशन का मूल्य निर्धारित नहीं किया गया है या जंप आउट को नियंत्रित नहीं करता है (जैसे GOTO के माध्यम से):
((DIR c:\xsgdde /w) || (DIR c:\ /w)) && (ECHO -=BINGO=-)
जटिल उदाहरण
यह समस्या को शुरू में हल करता है। प्रत्येक ब्लॉक में कई कथन संभव हैं लेकिन || || || अभिव्यक्ति यह संक्षिप्त करने के लिए बेहतर है ताकि यह यथासंभव पठनीय हो। ^ सीएमडी बैचों में एक एस्केप चार है और जब एक पंक्ति के अंत में रखा जाता है तो यह ईओएल से बच जाएगा और सीएमडी को अगली पंक्ति के बयानों के वर्तमान बैच को पढ़ना जारी रखने का निर्देश देगा।
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
(
(CALL :ProcedureType1 a b) ^
|| (CALL :ProcedureType2 sgd) ^
|| (CALL :ProcedureType1 c c)
) ^
&& (
ECHO -=BINGO=-
GOTO :EOF
)
ECHO -=no bingo for you=-
GOTO :EOF
:ProcedureType1
IF "%~1" == "%~2" (EXIT /B 0) ELSE (EXIT /B 1)
GOTO :EOF (this line is decorative as it's never reached)
:ProcedureType2
ECHO :ax:xa:xx:aa:|FINDSTR /I /L /C:":%~1:">nul
GOTO :EOF
If %x%==1 (
If %y%==1 (
:: both are equal to 1.
)
)
यह जाँचने के लिए है कि क्या एकाधिक चर समान मूल्य हैं। यहाँ या तो परिवर्तनशील है।
If %x%==1 (
:: true
)
If %x%==0 (
If %y%==1 (
:: true
)
)
If %x%==0 (
If %y%==0 (
:: False
)
)
मैं बस के बारे में सोचा था कि शीर्ष अगर मेरे सिर। मैं इसे और अधिक कॉम्पैक्ट कर सकता था।
मुझे एहसास है कि यह प्रश्न पुराना है, लेकिन मैं किसी और के मामले में (जैसे खुद के) वैकल्पिक समाधान पोस्ट करना चाहता था, जबकि एक ही प्रश्न था। मैं वैरिएबल की गूंज और मान्य करने के लिए खोज का उपयोग करके OR ऑपरेटर की कमी के आसपास काम करने में सक्षम था।
for /f %%v in ('echo %var% ^| findstr /x /c:"1" /c:"2"') do (
if %errorlevel% equ 0 echo true
)
जबकि dbenham का उत्तर बहुत अच्छा है, पर भरोसा IF DEFINED
करना आपको मुसीबत के भार में प्राप्त कर सकता है यदि आप जिस चर की जाँच कर रहे हैं वह पर्यावरण नहीं है चर नहीं है। स्क्रिप्ट चर को यह विशेष उपचार नहीं मिलता है।
इस जबकि कुछ ऊटपटांग अप्रलेखित बी एस की तरह लग सकता है, का एक सरल खोल क्वेरी कर IF
के साथ IF /?
पता चलता है कि,
परिभाषित सशर्त सिर्फ एक्स्टिस्ट की तरह काम करता है सिवाय इसके कि यह एक पर्यावरण चर नाम लेता है और अगर पर्यावरण चर को परिभाषित करता है तो यह सही है।
इस सवाल का जवाब देने के संबंध में, क्या मूल्यांकन की एक श्रृंखला के बाद एक साधारण ध्वज का उपयोग न करने का एक कारण है? OR
अंतर्निहित तर्क और पठनीयता के संबंध में यह मेरे लिए सबसे अधिक लचीली जाँच है। उदाहरण के लिए:
Set Evaluated_True=false
IF %condition_1%==true (Set Evaluated_True=true)
IF %some_string%=="desired result" (Set Evaluated_True=true)
IF %set_numerical_variable% EQ %desired_numerical_value% (Set Evaluated_True=true)
IF %Evaluated_True%==true (echo This is where you do your passing logic) ELSE (echo This is where you do your failing logic)
जाहिर है, वे सशर्त मूल्यांकन के किसी भी प्रकार हो सकते हैं, लेकिन मैं सिर्फ कुछ उदाहरण साझा कर रहा हूं।
यदि आप इसे एक पंक्ति में, लिखित-वार करना चाहते हैं, तो आप इन्हें एक साथ जोड़ सकते &&
हैं:
Set Evaluated_True=false
IF %condition_1%==true (Set Evaluated_True=true) && IF %some_string%=="desired result" (Set Evaluated_True=true) && IF %set_numerical_variable% EQ %desired_numerical_value% (Set Evaluated_True=true)
IF %Evaluated_True%==true (echo This is where you do your passing logic) ELSE (echo This is where you do your failing logic)
काम करने के लिए कभी नहीं मिला।
अगर g: xyz / what goto h: Else xcopy c: current / files g: bu / current मौजूद है तो मैं इसका उपयोग करता हूं, इसमें कोई बदलाव नहीं है। दुकान में लैपटॉप। और ऑफिस में कंप्यूटर। मैं वहाँ नहीं हूँ।
Windows XP के ऊपर काम करने के लिए कभी भी बैच फाइलें नहीं मिलीं
एक अधिक तेज़ विकल्प जो मैं आमतौर पर उपयोग करता हूं, वह इस प्रकार है, जैसा कि मैं कर सकता हूं "या" एक अनियंत्रित संख्या में स्थितियां जो चर अंतरिक्ष में फिट हो सकती हैं
@(
Echo off
Set "_Match= 1 2 3 "
)
Set /a "var=3"
Echo:%_Match%|Find " %var% ">nul || (
REM Code for a false condition goes here
) && (
REM code for a true condition goes here.
)
यह एहसास एक पुराने सवाल का एक सा है, प्रतिक्रियाओं मुझे एक बैच फ़ाइल के लिए कमांड लाइन तर्कों का परीक्षण करने के लिए एक समाधान के साथ आने में मदद की; इसलिए मैं अपने समाधान को पोस्ट करना चाहता था और साथ ही साथ कोई और भी इसी तरह के समाधान की तलाश में था।
पहली बात जो मुझे इंगित करनी चाहिए वह यह है कि मुझे IF ... ELSE स्टेटमेंट्स के लिए काम करना मुश्किल हो रहा था। बाहर निकलता है (अपने उदाहरणों में अनजाने में इसका उल्लेख करने के लिए डेंभम के लिए धन्यवाद) ईएलएसई का बयान समापन परियों से अलग लाइन पर नहीं हो सकता है।
इसलिए इसके बजाय:
FOR ... DO (
IF ... (
)
ELSE (
)
)
पठनीयता और सौंदर्य कारणों से मेरी प्राथमिकता क्या है, आपको यह करना होगा:
FOR ... DO (
IF ... (
) ELSE (
)
)
अब ELSE स्टेटमेंट एक गैर-मान्यताप्राप्त कमांड के रूप में वापस नहीं आता है।
अंत में, यहाँ मैं क्या करने का प्रयास कर रहा था - मैं किसी भी क्रम में बैच फ़ाइल में कई तर्कों को पारित करने में सक्षम होना चाहता था, मामले को अनदेखा कर रहा था, और अपरिभाषित तर्कों पर रिपोर्टिंग / असफल रहा। तो यहाँ मेरा समाधान है ...
@ECHO OFF
SET ARG1=FALSE
SET ARG2=FALSE
SET ARG3=FALSE
SET ARG4=FALSE
SET ARGS=(arg1 Arg1 ARG1 arg2 Arg2 ARG2 arg3 Arg3 ARG3)
SET ARG=
FOR %%A IN (%*) DO (
SET TRUE=
FOR %%B in %ARGS% DO (
IF [%%A] == [%%B] SET TRUE=1
)
IF DEFINED TRUE (
SET %%A=TRUE
) ELSE (
SET ARG=%%A
GOTO UNDEFINED
)
)
ECHO %ARG1%
ECHO %ARG2%
ECHO %ARG3%
ECHO %ARG4%
GOTO END
:UNDEFINED
ECHO "%ARG%" is not an acceptable argument.
GOTO END
:END
ध्यान दें, यह केवल पहले विफल तर्क पर रिपोर्ट करेगा। इसलिए यदि उपयोगकर्ता एक से अधिक अस्वीकार्य तर्क से गुजरता है, तो उन्हें केवल पहले के बारे में बताया जाएगा जब तक कि इसे ठीक नहीं किया जाता है, फिर दूसरा, आदि।
IF [%var%]==[1] IF [%var2%]==[2] ECHO BOTH ARE TRUE
:। मैं परिभाषित करता थाSET AND=IF
और फिर लिखता थाIF cond1 %AND% cond2 ECHO BOTH ARE TRUE
:।