बैच फ़ाइल में यदि - और संरचना का उपयोग कैसे करें?


136

मेरे पास एक सवाल है कि क्या - एक बैच फ़ाइल में और संरचना। प्रत्येक कमांड व्यक्तिगत रूप से चलती है, लेकिन मैं "if - else" को सुरक्षित रूप से उपयोग नहीं कर सकता, इसलिए मेरे प्रोग्राम के ये हिस्से काम नहीं करते हैं। मैं इन भागों को कैसे चला सकता हूं? धन्यवाद।

IF %F%==1 IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )
ELSE IF %F%==1 IF %C%==0 (
    ::moving the file c to d
    move "%sourceFile%" "%destinationFile%"
    )

ELSE IF %F%==0 IF %C%==1 (
    ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
    xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
    )
ELSE IF %F%==0 IF %C%==0 (
    ::moving a directory
    xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
    rd /s /q "%sourceMoveDirectory%"
    )

क्या मेरा प्रश्न स्पष्ट रूप से पढ़ा गया है? मैंने इसे लाइन से लाइन में पढ़ा है लेकिन यह मुझे एक तरफ से लगता है।
नामस्रोत

4
नमस्ते, ढेर अतिप्रवाह में आपका स्वागत है! कोड ब्लॉक बनाने के लिए आप संबंधित टेक्स्ट को हाइलाइट कर सकते हैं और {}बटन पर क्लिक कर सकते हैं ; यह पदों को अधिक पठनीय बनाने में मदद करता है और मार्क-अप के साथ कुछ समस्याओं से बचा जाता है। आपके सवाल के जवाब में, यह अब करता है! एक प्रश्न लिखते समय नीचे एक पूर्वावलोकन होता है ताकि आप देख सकें कि एक बार पोस्ट करने पर यह कैसा दिखेगा।
बेन

1
तो आपके स्पष्टीकरण के लिए धन्यवाद। मैं इन विधि का उपयोग करने जा रहा हूं।
नाम

जवाबों:


110

आपका सिंटैक्स गलत है। आप उपयोग नहीं कर सकते ELSE IF। ऐसा प्रतीत होता है कि आपको वास्तव में वैसे भी इसकी आवश्यकता नहीं है। बस कई IFबयानों का उपयोग करें :

IF %F%==1 IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )

IF %F%==1 IF %C%==0 (
    ::moving the file c to d
    move "%sourceFile%" "%destinationFile%"
    )

IF %F%==0 IF %C%==1 (
    ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
    xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
    )

IF %F%==0 IF %C%==0 (
    ::moving a directory
    xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
    rd /s /q "%sourceMoveDirectory%"
    )

महान बैच फ़ाइल संदर्भ: http://ss64.com/nt/if.html


2
कृपया मुझे सही करें अगर मैं गलत हूं, लेकिन मुझे नहीं लगता कि आप &&कई ifस्थितियों में उपयोग कर सकते हैं, मेरा वैकल्पिक सिंटैक्स देखें?
बाली C

अगर मेरी स्थिति इस तरह से है: "अगर% F% == 0" सुरक्षित रूप से चलाते हैं, लेकिन जब मैंने जोड़ा और & quot; यह नहीं चलता है। अगर मैं दो स्थितियों का उपयोग कैसे कर सकता हूं?
eponymous

1
@aprogrammer, मेरे उदाहरण को देखें। यदि आपके पास कई स्थितियां हैं, तो उपयोग करेंIF condition1 IF condition 2
जेम्स हिल

मैंने आपके उत्तर की कोशिश की थी, लेकिन मैं इसे नहीं चला सकता था, लेकिन मैंने फिर से कोशिश की और अपने कोड चींटी को संशोधित किया। मेरे कोड के कुछ भाग की अंतिम स्थिति इस प्रकार है: IF% F% == 1 IF% C% == 1 (:: फ़ाइल की प्रतिलिपि करने के लिए d प्रतिलिपि करने के लिए "% sourceFile%" "% गंतव्य फ़ाइल%") ELSE (IF % F% == 1 IF% C% == 0 (:: फ़ाइल c को d चाल में ले जाने के लिए "% sourceFile%" "% गंतव्य फ़ाइल%")) ELSE (IF% F% == 0 IF% C% == 1 (:: d, / s: boş olanlar hariç, / e: boş olanlar dahil xcopy "% sourceCopyDirectory%" "% destinationCopyDirectory% / s / e) से एक निर्देशिका की प्रतिलिपि बना रहा है
नामांकित करें

4
तुम्हारा क्या मतलब है आप उपयोग नहीं कर सकते हैं ELSE IF? यह Win7 के तहत ठीक काम करता है। उदाहरण देखें: paste2.org/G8tMae92
bryc

56

मुझे लगता है कि प्रश्न में और कुछ उत्तरों में DOS में इस छद्मकोश के अर्थ के बारे में थोड़ा भ्रम है: IF A IF BX ELSE Y। इसका मतलब IF and A और B नहीं है, X X ELP Y, लेकिन तथ्य का अर्थ है IF A (IF B THEN X ELSE Y)। यदि A की परीक्षा विफल हो जाती है, तो वह पूरे भीतर की-अगर और अनदेखी की जाएगी।

जैसा कि वर्णित उत्तरों में से एक है, इस मामले में केवल एक परीक्षण सफल हो सकता है इसलिए 'और' की आवश्यकता नहीं है, लेकिन निश्चित रूप से जो केवल इस उदाहरण में काम करता है, यह if-else करने के लिए एक सामान्य समाधान नहीं है।

इसके आस-पास बहुत सारे तरीके हैं। यहाँ कुछ विचार है, सभी काफी बदसूरत हैं, लेकिन हे, यह (या कम से कम था) डॉस!

@echo off

set one=1
set two=2

REM Example 1

IF %one%_%two%==1_1 (
   echo Example 1 fails
) ELSE IF %one%_%two%==1_2 (
   echo Example 1 works correctly
) ELSE (
    echo Example 1 fails
)

REM Example 2

set test1result=0
set test2result=0

if %one%==1 if %two%==1 set test1result=1
if %one%==1 if %two%==2 set test2result=1

IF %test1result%==1 (
   echo Example 2 fails
) ELSE IF %test2result%==1 (
   echo Example 2 works correctly
) ELSE (
    echo Example 2 fails
)

REM Example 3

if %one%==1 if %two%==1 (
   echo Example 3 fails
   goto :endoftests
)
if %one%==1 if %two%==2 (
   echo Example 3 works correctly
   goto :endoftests
)
echo Example 3 fails
)
:endoftests

मुझे लगता है कि पहले दो setको प्रतिशत संकेतों की आवश्यकता नहीं है; होना चाहिएset one=1
ज्योफ

13

AFAIK आप एक if elseबैच में नहीं कर सकते जैसे आप अन्य भाषाओं में कर सकते हैं, यह नेस्टेड होना है if

नेस्टेड का उपयोग करने से ifआपका बैच कैसा दिखेगा

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    ) ELSE (
        IF %F%==1 IF %C%==0(
        ::moving the file c to d
        move "%sourceFile%" "%destinationFile%"
        ) ELSE (
            IF %F%==0 IF %C%==1(
            ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
            xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
            ) ELSE (
                IF %F%==0 IF %C%==0(
                ::moving a directory
                xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
                rd /s /q "%sourceMoveDirectory%"
                )
            )
        )
    )

या जैसा कि जेम्स ने सुझाव दिया है, श्रृंखला अपने if, हालांकि मुझे लगता है कि उचित वाक्यविन्यास है

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )

1
if else, विशेषकर सी-लाइक भाषाओं में ifभी एक नेस्टेड है। आपको उन्हें बैच फ़ाइलों में ब्लॉक के साथ घोंसला बनाने की ज़रूरत नहीं है।
जॉय

@ जोय मैं काफी फॉलो नहीं करता। मुझे पता है कि else ifकॉम्बो सिर्फ एक नेस्टेड है ifलेकिन मुझे नहीं लगा कि आप उन कीवर्ड्स को बैच में एक साथ इस्तेमाल कर सकते हैं जैसे आप सी भाषाओं में कर सकते हैं।
बाली सी।

हम्म मैं इसे अभी भी काम करने के लिए नहीं मिल सकता, लेकिन मैं इसके लिए आपका शब्द ले लूंगा, आप जानते हैं कि आप किस बारे में बात कर रहे हैं, मैं इस जवाब को एक लंबे संस्करण के रूप में छोड़ दूंगा :)
बाली सी

आपके उत्तर के लिए धन्यवाद, लेकिन उनमें से कोई भी मेरे कोड में नहीं चला।
नामस्रोत

एक और उदाहरण: अगर 1 == 1 (प्रतिध्वनि 1) और (यदि 1 == 1 (प्रतिध्वनि 2) अन्य) (प्रतिध्वनि 3))
JohnP2

1

मेरा मानना ​​है कि आप कुछ इस तरह का उपयोग कर सकते हैं

if ___ (

do this

) else if ___ (

do this

)

27
दूसरी स्थिति में कथन "क्या" नहीं होना चाहिए?
1

7
@bvj नहीं, नहीं, आपको यह सब गलत लगा। यह होना चाहिए do fooऔर do bar
yyny

जब आप लिखते हैं IF (test) (command) ELSE IF (test) (command), आप आसन्न होते हैं IF (test) (command) ELSE (IF (test) (command))। यह कभी-कभी काम कर सकता है, लेकिन अगर आपको लगता है कि यह वास्तविक प्रोग्रामिंग संरचना है जो डॉस में स्वीकार्य है, तो यह विफल होने पर समस्या का निवारण करने के लिए एक PITA होने जा रहा है।
टिम

1

थोड़ा देर से और शायद जटिल-यदि परिस्थितियों के लिए अभी भी अच्छा है, क्योंकि मैं एक "किया गया" पैरामीटर जोड़ना चाहूंगा, अगर एक-तत्कालीन संरचना रखने के लिए:

set done=0
if %F%==1 if %C%==0 (set done=1 & echo found F=1 and C=0: %F% + %C%)
if %F%==2 if %C%==0 (set done=1 & echo found F=2 and C=0: %F% + %C%)
if %F%==3 if %C%==0 (set done=1 & echo found F=3 and C=0: %F% + %C%)
if %done%==0 (echo do something)

0

IF...ELSE IF जब आप प्रत्येक IF लाइन पर केवल एक सशर्त अभिव्यक्ति का उपयोग करते हैं, तो विशेष रूप से बैच फ़ाइलों में निर्माण बहुत अच्छा होता है:

IF %F%==1 (
    ::copying the file c to d
    copy "%sourceFile%1" "%destinationFile1%"
) ELSE IF %F%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%" )

आपके उदाहरण में आप IF...AND...IFटाइप कंस्ट्रक्शन का उपयोग करते हैं , जहाँ 2 शर्तों को एक साथ पूरा किया जाना चाहिए। इस मामले में आप अभी भी IF...ELSE IFनिर्माण का उपयोग कर सकते हैं , लेकिन अगले ईएलएसई स्थिति के लिए अनिश्चितता से बचने के लिए अतिरिक्त कोष्ठक के साथ:

IF %F%==1 (IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile1%" "%destinationFile1%" )
) ELSE IF %F%==1 (IF %C%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%"))

उपरोक्त निर्माण इसके बराबर है:

IF %F%==1 (
    IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile1%" "%destinationFile1%"
    ) ELSE IF %C%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%"))

बैच कमांड का प्रोसेसिंग अनुक्रम CMD.exe पार्सिंग ऑर्डर पर निर्भर करता है । बस सुनिश्चित करें कि आपका निर्माण उस तार्किक आदेश का पालन करता है, और एक नियम के रूप में यह काम करेगा। यदि आपके बैच स्क्रिप्ट को Cmd.exe द्वारा त्रुटियों के बिना संसाधित किया गया है, तो इसका मतलब है कि यह सही है (अर्थात आपके OS Cmd.exe संस्करण द्वारा समर्थित) निर्माण, भले ही किसी ने कहा हो।


0

यहाँ मेरा कोड उदाहरण के लिए if..else..if है
जो निम्न कार्य करते हैं

प्रक्रिया के नाम के लिए शीघ्र उपयोगकर्ता

यदि प्रक्रिया का नाम अमान्य है,
तो यह उपयोगकर्ता को लिखता है

Error : The Processor above doesn't seem to be exist 

यदि प्रक्रिया का नाम सेवाओं है
तो यह उपयोगकर्ता को लिखता है

Error : You can't kill the Processor above 

यदि प्रक्रिया का नाम वैध है और सेवाएं नहीं हैं
तो यह उपयोगकर्ता को लिखता है

प्रक्रिया के माध्यम से मौत हो गई हैtaskill

इसलिए मैंने इसे प्रोसेस किलर कहा है।
यहाँ मेरा कोड है:

@echo off

:Start
Rem preparing the batch  
cls
Title Processor Killer
Color 0B
Echo Type Processor name to kill It (Without ".exe")
set /p ProcessorTokill=%=%  

:tasklist
tasklist|find /i "%ProcessorTokill%.exe">nul & if errorlevel 1 (
REM check if the process name is invalid 
Cls 
Title %ProcessorTokill% Not Found
Color 0A
echo %ProcessorTokill%
echo Error : The Processor above doesn't seem to be exist    

) else if %ProcessorTokill%==services (
REM check if the process name is services and doesn't kill it
Cls 
Color 0c
Title Permission denied 
echo "%ProcessorTokill%.exe"
echo Error : You can't kill the Processor above 

) else (
REM if the process name is valid and not services
Cls 
Title %ProcessorTokill% Found
Color 0e
echo %ProcessorTokill% Found
ping localhost -n 2 -w 1000>nul
echo Killing %ProcessorTokill% ...
taskkill /f /im %ProcessorTokill%.exe /t>nul
echo %ProcessorTokill% Killed...
)

pause>nul



REM If else if Template
REM if thing1 (
REM Command here 2 ! 
REM ) else if thing2 (
REM command here 2 !
REM ) else (
REM command here 3 !
REM )

0

यहाँ है अगर मैं और अगर स्थिति को संभाला

if %env%==dev ( 
    echo "dev env selected selected"
) else (
    if %env%==prod (
        echo "prod env selected"
    )
)

ध्यान दें कि यह वैसा ही नहीं है, जैसा कि सी-++ या जावा जैसी अन्य प्रोग्रामिंग भाषाओं के रूप में है, लेकिन यह वही करेगा जो आपको करने की आवश्यकता है

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