एक घातक सिंटैक्स त्रुटि का उपयोग करना, के रूप में जेब को दर्शाता है, सभी बैच प्रोसेसिंग मारने करता है, लेकिन यह भी एक बुरा पक्ष प्रभाव पड़ता है - SETLOCAL के बाद पर्यावरण परिवर्तन संरक्षित कर रहे हैं, भले ही वे निहित ENDLOCAL के माध्यम से खारिज किया जा करने वाले हैं जब बैच प्रसंस्करण समाप्त होता है। अधिक जानकारी के लिए मेरे डॉसटिप्स SETLOCAL continues after batch termination! पोस्ट करें।
Why does a non-interactive batch script think I've pressed control-C? पर जानकारी के आधार पर, मैंने कॉल किए गए दिनचर्या या स्क्रिप्ट के भीतर से सभी बैच स्क्रिप्टिंग से बाहर निकलने के लिए एक साफ तरीका खोज लिया है, और सेटोकल के बाद सभी परिवर्तन ठीक से त्याग दिए गए हैं।
@echo off
setlocal
set test=AFTER main SETLOCAL
call :sub
echo returning from main NEVER REACHED
exit /b
:sub
setlocal
set test=AFTER sub SETLOCAL
set test
call :ExitBatch
echo returning from sub2 NEVER REACHED
exit /b
:ExitBatch - Cleanly exit batch processing, regardless how many CALLs
if not exist "%temp%\ExitBatchYes.txt" call :buildYes
call :CtrlC <"%temp%\ExitBatchYes.txt" 1>nul 2>&1
:CtrlC
cmd /c exit -1073741510
:buildYes - Establish a Yes file for the language used by the OS
pushd "%temp%"
set "yes="
copy nul ExitBatchYes.txt >nul
for /f "delims=(/ tokens=2" %%Y in (
'"copy /-y nul ExitBatchYes.txt <nul"'
) do if not defined yes set "yes=%%Y"
echo %yes%>ExitBatchYes.txt
popd
exit /b
उपर्युक्त test.bat चलाने का नमूना आउटपुट यहां दिया गया है। आप देख सकते हैं कि स्क्रिप्ट कभी भी वापस नहीं आया: ExitBatch कॉल, और बैच प्रोसेसिंग समाप्त होने के बाद परीक्षण चर परिभाषा को ठीक से हटा दिया गया है।
C:\test>test.bat
test=AFTER sub SETLOCAL
C:\test>set test
Environment variable test not defined
C:\test>
: ExitBatch दिनचर्या को अपने स्वयं के ExitBatch में रखा जा सकता है।बल्ले स्क्रिप्ट और अपने पैथ के भीतर कहीं भी रखा गया है कि इसे किसी भी बैच स्क्रिप्ट द्वारा आसानी से उपयोग किया जा सकता है।
@echo off
:ExitBatch - Cleanly exit batch processing, regardless how many CALLs
if not exist "%temp%\ExitBatchYes.txt" call :buildYes
call :CtrlC <"%temp%\ExitBatchYes.txt" 1>nul 2>&1
:CtrlC
cmd /c exit -1073741510
:buildYes - Establish a Yes file for the language used by the OS
pushd "%temp%"
set "yes="
copy nul ExitBatchYes.txt >nul
for /f "delims=(/ tokens=2" %%Y in (
'"copy /-y nul ExitBatchYes.txt <nul"'
) do if not defined yes set "yes=%%Y"
echo %yes%>ExitBatchYes.txt
popd
exit /b
महत्वपूर्ण अपडेट:
अब यह मजबूत अपवाद शुद्ध बैच के साथ निपटने के लागू करने के लिए संभव है। न केवल आप एक अपवाद फेंक सकते हैं जो किसी भी कॉल स्तर से सभी बैच प्रोसेसिंग को समाप्त कर सकता है, लेकिन आप उच्च स्तर पर अपवाद भी पकड़ सकते हैं, विशेष अपवाद हैंडलिंग क्लीनअप कोड को समाप्त कर सकते हैं, और प्रसंस्करण फिर से शुरू कर सकते हैं, या किसी अन्य फेंक के माध्यम से बाहर निकलना जारी रख सकते हैं! अधिक जानकारी के लिए Does Windows batch support exception handling? देखें।
@echo off
:: comment next line if you want to export any local variables in caller environment
setlocal
set FLAG=1
rem Do something
call :interactive_check
set FLAG2=2
rem Do something
call :interactive_check
goto :eof
:interactive_check
if errorlevel 1 (
echo.
echo /!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\
echo Error in compilation process... exiting
echo /!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\
(goto) 2>nul & endlocal & exit /b %ERRORLEVEL%
) else (
echo Continuing to next step
)
goto :eof
यह आदेश जो त्रुटि उत्पन्न से त्रुटि कोड की बचत होती है:
आप नहीं कर सकते। 'If errorlevel 1 goto error' के साथ बस 'कॉल: इंटरएक्टिव_चेक'' को प्रतिस्थापित करें। पूर्व या बाद की प्रतिलिपि बनाने के बीच बहुत अंतर नहीं है। :) – atzz
समझ गया, इस के साथ समस्या हल हो गई और यह ठीक काम करता है, धन्यवाद! – Gui13