2009-07-26 17 views
6

यदि कोई त्रुटि हुई है, तो मैं फॉर लूप से तोड़ने/बाहर निकलने का तरीका खोजने का प्रयास कर रहा हूं। नीचे बैच फ़ाइल की सामग्री है।फॉर लूप के लिए बाहर निकलें - विंडोज कमांड प्रोसेसर (सीएमडी.एक्सईई)

@echo on 

set myfile=D:\sample.txt 

FOR /F "tokens=1,2 delims=," %%i in (%myfile%) do call :process "%%i" 

:process 
set recfile=%1% 

echo %recfile% 
echo "Step in Test1" 
echo %errorlevel% 
pause; 

exit /B 0 
If %errorlevel% NEQ 0 goto :fail1 

:fail1 
echo "Step in fail1" 
pause; 
exit /B 9993 

:EOF 

नमूना.txt में कई रिकॉर्ड हैं। अगर कोई त्रुटि हुई है तो मैं बैच फ़ाइल से बाहर निकलने की अपेक्षा कर रहा हूं, फिर पूर्ण नमूना.txt फ़ाइल की जांच कर रहा हूं। जैसे स्टेटमेंट echo% recfile%, अगर मैं कुछ गलत कमांड ech% recfile% डालता हूं जो गलत कमांड है तो मुझे उम्मीद है कि इसे विफल 1 स्तर पर जाना चाहिए और बाहर निकलना चाहिए। यह त्रुटि कोड को सफलतापूर्वक catured है और विफल होने के बाद 1 स्तर पर इस स्थिति के बाद, यह sample.txt फ़ाइल (अगला रिकॉर्ड) फिर से जांच रहा है। क्या कोई रास्ता है, अगर मैं लूप के लिए तोड़ सकता/निकाल सकता हूं।

कृपया सलाह दें।

धन्यवाद,

उत्तर

4

आप एक चर सेट कर सकते हैं, जिसका अर्थ है कि पूरा पाश निरस्त किया जाना चाहिए और इस तरह इसका इस्तेमाल:

:fail1 
echo "Step in fail1" 
pause 
set exit=1 

और तुम इस तरह पाश को बदल देंगे:

FOR /F "tokens=1,2 delims=," %%i in (%myfile%) do (
    if defined exit (
    exit /b 9993 
) else (
    call :process "%%i" 
) 
) 

(पठनीयता के लिए कई पंक्तियों में विभाजित)।

चूंकि आप for लूप से सबराउटिन को कॉल कर रहे हैं, इसलिए इस सबराउटिन को सीधे लूप से बाहर निकलने का कोई तरीका नहीं है। इसलिए एक चर के साथ कामकाज।

5

जॉय का जवाब बहुत अच्छा है। मैंने इसे सफलतापूर्वक इस्तेमाल किया है। मैंने पाया कि आपको स्क्रिप्ट से बाहर निकलने की ज़रूरत नहीं है। आप goto :SomeLabel का उपयोग कर सकते हैं, जहां :SomeLabel लूप के बाहर एक लेबल है।

 
FOR /F "tokens=1,2 delims=," %%i in (%myfile%) do (
    if defined exit goto :ParseError 
    call :process "%%i" 
) 

@echo SUCCESS: %myfile% 
goto :RestOfScript 

:ParseError 
@echo FAILURE: cannot parse %myfile% 
@echo Using defaults... 

:RestOfScript 
... 

2

आप एक लेबल

set USBDRIVE=SETLOCAL 
set exit=ENABLEDELAYEDEXPANSION 

FOR %%D IN (C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO (
    DIR %%D:\SOURCES\INSTALL.WIM > nul 2>&1 && call set USBDRIVE=%%D: && call set exit=1 
    if defined exit goto :dd3 
) 
:dd3 
+1

क्या है कॉल करने के लिए की जरूरत नहीं है 'ENABLEDELAYEDEXPANSION' यहां क्या कर ?! –

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