2011-02-13 15 views
78

एक डॉस बैच फ़ाइल में हमारे पास स्टेटमेंट बॉडी होने पर केवल 1 लाइन हो सकती है? मुझे लगता है कि मुझे कहीं पता चला है कि मैं () का उपयोग कर सकता हूं यदि {} सी-जैसी प्रोग्रामिंग भाषाओं में उपयोग किया जाता है, लेकिन जब मैं इसे आज़माता हूं तो यह कथन निष्पादित नहीं कर रहा है। कोई त्रुटि संदेश या तो नहीं। यह मेरा कोड:क्या मेरे पास डॉस बैच फ़ाइल में आईएफ ब्लॉक हो सकता है?

if %GPMANAGER_FOUND%==true(echo GP Manager is up 
goto Continue7 
) 
echo GP Manager is down 
:Continue7 

अजीब न है और न ही "जीपी प्रबंधक नीचे है" मुद्रित हो जाता है जब मैं बैच फ़ाइल को चलाने "जीपी प्रबंधक है।"

+0

शायद यह मदद कर सकता है: http://commandwindows.com/batchfiles-branching.htm – esaj

+0

हां, इससे मदद मिलती है। डॉस बेकार है। अगर मैं कई बयानों का उपयोग करना चाहता हूं, तो मुझे कथन के बीच और अन्य का उपयोग करना होगा? या क्या एक और सुरुचिपूर्ण तरीका है? –

उत्तर

108

आप वास्तव में सशर्त के बाद निष्पादित करने के लिए बयानों का एक ब्लॉक बना सकते हैं। लेकिन आपके पास वाक्यविन्यास गलत है। कोष्ठक वास्तव में इस्तेमाल किया जाना चाहिए दिखाया गया है:

if <statement> (
    do something 
) else (
    do something else 
) 

हालांकि, मैं नहीं मानता है कि वहाँ किसी भी अंतर्निहित else-if बयानों के लिए वाक्य रचना। दुर्भाग्य से आपको इसे संभालने के लिए if कथन के नेस्टेड ब्लॉक बनाने की आवश्यकता होगी।


दूसरा, %GPMANAGER_FOUND% == true परीक्षण मेरे लिए शक्तिशाली संदिग्ध दिखता है। मुझे नहीं पता कि पर्यावरण परिवर्तक क्या सेट है या आप इसे कैसे सेट कर रहे हैं, लेकिन मुझे बहुत संदेह है कि आपके द्वारा दिखाए गए कोड से आप जिस परिणाम को खोज रहे हैं उसका उत्पादन करेंगे।


निम्न नमूना कोड मेरे लिए ठीक काम करता है:

@echo off 

if ERRORLEVEL == 0 (
    echo GP Manager is up 
    goto Continue7 
) 
echo GP Manager is down 
:Continue7 

कृपया मेरे नमूना कोड के बारे में कुछ विशिष्ट विवरण पर ध्यान दें:

  • अंतरिक्ष सशर्त बयान के अंत के बीच कहा, और उद्घाटन कंस्ट्रैसिस।
  • मैं कंसोल के लिए मुद्रित रूप में वे पर अमल बयानों के सभी देखने से रोकने के @echo off की स्थापना कर रहा हूँ, और इसके बजाय सिर्फ उन है कि विशेष रूप से echo के साथ शुरू के उत्पादन में देखते हैं।
  • मैं एक परीक्षण के रूप में अंतर्निहित ERRORLEVEL चर का उपयोग कर रहा हूं। और पढ़ें here
+0

% ERRORLEVEL% == 0 का बेहतर उपयोग, क्योंकि अन्य संस्करण हमेशा सत्य है, क्योंकि अगर ERRORLEVEL सत्य है, तो त्रुटि त्रुटि बराबर या अधिक है, तो इस मामले में "==" को अनदेखा किया जाता है – jeb

+0

@jeb: मुझे लगता है आप बिंदु चूक गए हो सकता है। 'ERRORLEVEL' का उपयोग करना उसकी समस्या का उत्तर नहीं है। मैं बस उचित वाक्यविन्यास का एक उदाहरण पोस्ट कर रहा था। * या तो * इस मामले में फॉर्म स्वीकार्य है, जैसा कि '0 == 0' या कोई अन्य छोटी अभिव्यक्ति होगी। लेकिन वास्तव में, सुनिश्चित करें कि आप पर्यावरण परिवर्तक '% ERRORLEVEL%' और कमांड प्रोसेसर के आंतरिक 'ERRORLEVEL' के बीच अंतर को समझते हैं। रेमंड चेन ने इसे अच्छी तरह से समझाया [यहां इस ब्लॉग पर] (http://blogs.msdn.com/b/oldnewthing/archive/2008/09/26/8965755.aspx)। –

+0

क्या आपके पास कोई ईएलएसई है? – xagyg

12

तार्किक रूप से, कोड़ी के जवाब चाहिए काम करते हैं। हालांकि मुझे नहीं लगता कि कमांड प्रॉम्प्ट एक कोड ब्लॉक को तार्किक रूप से संभालता है। मेरे जीवन के लिए मैं ब्लॉक के भीतर एक भी कमांड के साथ ठीक से काम करने के लिए नहीं मिल सकता। मेरे मामले में, व्यापक परीक्षण से पता चला कि ब्लॉक के भीतर सभी आदेशों को कैश किया जा रहा है, और ब्लॉक के अंत में एक साथ निष्पादित किया गया है। यह निश्चित रूप से अपेक्षित परिणाम नहीं देता है। यहाँ एक oversimplified उदाहरण है:

if %ERRORLEVEL%==0 (
set var1=blue 
set var2=cheese 
set var3=%var1%_%var2% 
) 

यह निम्नलिखित मूल्य के साथ var3 प्रदान करना चाहिए:

blue_cheese 

लेकिन इसके बजाय पैदावार:

सभी 3 क्योंकि
_ 

आदेशों कैश की गई और क्रियान्वित कर रहे हैं कोड ब्लॉक से बाहर निकलने के साथ-साथ।

यदि मैं केवल एक कमांड निष्पादित करने के लिए ब्लॉक को फिर से लिखकर इस समस्या को दूर करने में सक्षम था - गोटो - और कुछ लेबल जोड़ना। इसका घबराहट, और मुझे यह पसंद नहीं है, लेकिन कम से कम यह काम करता है।

if %ERRORLEVEL%==0 goto :error0 
goto :endif 

:error0 
set var1=blue 
set var2=cheese 
set var3=%var1%_%var2% 

:endif 
+7

की अनुमति देता है कि ऐसा करना चाहिए काम: उपयोग करें: 'सेट var3 =! var1! _! var2! ' – Dracorat

0

हो सकता है कि थोड़ी देर हो चुकी है, लेकिन यह hellps उम्मीद:

@echo off 

if %ERRORLEVEL% == 0 (
msg * 1st line WORKS FINE rem You can relpace msg * with any othe operation... 
goto Continue1 
) 
:Continue1 
If exist "C:\Python31" (
msg * 2nd line WORKS FINE rem You can relpace msg * with any othe operation... 
    goto Continue2 
) 
:Continue2 
If exist "C:\Python31\Lib\site-packages\PyQt4" ( 
msg * 3th line WORKS FINE rem You can relpace msg * with any othe operation... 
    goto Continue3 
) 
:Continue3 
msg * 4th line WORKS FINE rem You can relpace msg * with any othe operation... 
    goto Continue4 
) 
:Continue4 
msg * "Tutto a posto" rem You can relpace msg * with any othe operation... 
pause 
-1
इस गोटो गंदगी के बजाय

, एम्परसेंड & या डबल एम्परसेंड & & (ERRORLEVEL को सशर्त 0) आदेश विभाजक के रूप में उपयोग करके देखें।

मैंने संक्षेप में इस चाल के साथ एक स्क्रिप्ट स्निपेट तय किया है, मेरे पास तीन बैच फ़ाइलें हैं, जो एक दूसरे को कॉल करती है जब बाहरी बैकअप ड्राइव असाइन किए गए हैं। मैं प्राथमिक फाइल को पहली बाहरी ड्राइव पर छोड़ देता हूं ताकि उसके बैकअप दिनचर्या पर कॉल ठीक काम कर सकें, लेकिन दूसरे को कॉल करने के लिए सक्रिय ड्राइव परिवर्तन की आवश्यकता होती है। नीचे दिए गए कोड से पता चलता है कि कैसे मैं यह तय: %% ख के लिए (defghijklmnopqrstuvwx YZ) में

DO ( अगर मौजूद "%% ख: \ Backup.cmd" %% ख: & कॉल "%% ख: \ बैकअप .cmd " )

+0

पृथ्वी पर क्यों यह डाउनवॉटेड है? मुझे ठीक इसी की आवश्यकता थी। – ggb667

+0

@ जीसीबी 667 - @ लुइस "को स्पष्ट करने के लिए" एक उत्तर "लिखा गया है जो आईएफ स्टेटमेंट मूल पोस्टर के लिए काम नहीं कर रहा था, इस समस्या से संबंधित नहीं है। यह" विनीजोहनसन "के उत्तर से संबंधित है (जो मूल पोस्टर्स समस्या भी चूक गया)। –

0

मैं बैच फ़ाइल में आईएफ कमांड से संबंधित एक खोज द्वारा लौटाए गए परिणामों में इस लेख में भाग गया, और मैं गलत धारणा को सही करने के अवसर का विरोध नहीं कर सकता कि अगर ब्लॉक एकल तक सीमित हैं आदेश देता है। एक उत्पादन विंडोज एनटी कमांड स्क्रिप्ट का एक हिस्सा है जो उस मशीन पर प्रतिदिन चलता है जिस पर मैं इस उत्तर को लिख रहा हूं।

if "%COPYTOOL%" equ "R" (
    WWLOGGER.exe "%APPDATA%\WizardWrx\%~n0.LOG" "Using RoboCopy to make a backup of %USERPROFILE%\My Documents\Outlook Files\*" 
    %TOOLPATH% %SRCEPATH% %DESTPATH% /copyall %RCLOGSTR% /m /np /r:0 /tee 
    C:\BIN\ExitCodeMapper.exe C:\BIN\ExitCodeMapper.INI[Robocopy] %TEMP%\%~n0.TMP %ERRORLEVEL% 
) else (
    WWLOGGER.exe "%APPDATA%\WizardWrx\%~n0.LOG" "Using XCopy to make a backup of %USERPROFILE%\My Documents\Outlook Files\*" 
    call %TOOLPATH% "%USERPROFILE%\My Documents\Outlook Files\*" "%USERPROFILE%\My Documents\Outlook Files\_backups" /f /m /v /y 
    C:\BIN\ExitCodeMapper.exe C:\BIN\ExitCodeMapper.INI[Xcopy] %TEMP%\%~n0.TMP %ERRORLEVEL% 
) 

शायद दो या अधिक लाइनों के ब्लॉक, Windows NT कमांड पटकथा (.cmd फ़ाइलें) के लिए विशेष रूप से लागू होता है क्योंकि एक आवेदन के उत्पादन स्क्रिप्ट निर्देशिका की एक खोज है कि पुराने स्कूल बैच के लिए प्रतिबंधित है (बल्ला) फ़ाइलें , केवल एक कमांड ब्लॉक प्रकट किया। चूंकि आवेदन विस्तारित रखरखाव में चला गया है (जिसका अर्थ है कि मैं इसे समर्थन देने में सक्रिय रूप से शामिल नहीं हूं), मैं यह नहीं कह सकता कि ऐसा इसलिए है क्योंकि मुझे एक से अधिक पंक्ति की आवश्यकता नहीं थी, या मैं उन्हें काम नहीं कर सका।

भले ही, यदि बाद वाला सत्य है, तो एक सरल कामकाज है; एकाधिक लाइनों को या तो एक अलग बैच फ़ाइल या बैच फ़ाइल सबराउटिन में ले जाएं। मुझे पता है कि उत्तरार्द्ध दोनों प्रकार की स्क्रिप्ट में काम करता है।

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