2012-12-05 5 views
10

ऐसा लगता है कि जब से मैं बैच स्क्रिप्ट में अपने चर घोषित करने के लिए एसईटी का उपयोग करता हूं, यदि मैं इसे cmd में कई बार चलाता हूं, तो वैरिएबल मान तब तक जारी रहेगा जब तक कि मैं उन्हें स्पष्ट रूप से रीसेट नहीं करता।प्रत्येक बैच स्क्रिप्ट चलाने के बाद चर साफ़ करने के लिए कैसे?

क्या मुझे यह निर्धारित करने के लिए सेटलोकल और एंडलोकल का उपयोग करना है कि सीएमडी को बंद किए बिना एक रन से चर किसी दूसरे पर नहीं रहें?

उत्तर

13

हां, आपको सेटलोकल का उपयोग करना चाहिए। यह किसी भी बदलाव को स्थानीयकृत करेगा जैसे कि एंडलोकल जारी होने के बाद पुराना वातावरण बहाल किया जाएगा।

जब सभी स्क्रिप्ट प्रोसेसिंग समाप्त हो जाती है और आपको कमांड लाइन संदर्भ में वापस कर दिया जाता है, तो प्रत्येक सक्रिय सेटलोकल के लिए एक अंतर्निहित अंतराल जारी किया जाता है। स्पष्ट रूप से एंडलोकल जारी करने की कोई आवश्यकता नहीं है।

इसके अलावा, यदि आपकी स्क्रिप्ट (या दिनचर्या) कॉल की जाती है, तो जब कॉल पूरा हो जाता है तो कॉल किए गए दिनचर्या में जारी किए गए प्रत्येक सक्रिय सेटलोकल के लिए एक अंतर्निहित अंतराल होता है।

एक बुलाया दिनचर्या के भीतर
var=pre-CALL value 
var=within CALL value 
var=pre-CALL value 

ENDLOCAL एक रोलबैक कभी नहीं होगा: उदाहरण के लिए एक नियमित के अंत में ENDLOCAL डाल करने के लिए, (हालांकि यह चोट नहीं करता है)

@echo off 
set var=pre-CALL value 
echo var=%var% 
call :test 
echo var=%var% 
exit /b 

:test 
setlocal 
set var=within CALL value 
echo var=%var% 
exit /b 

उत्पादन की आवश्यकता नहीं है सेटलोकल जिसे कॉल से पहले जारी किया गया था। उदाहरण के लिए।

@echo off 
setlocal 
set var=VALUE 1 
setlocal 
set var=VALUE 2 
echo before call: var=%var% 
call :test 
echo after call: var=%var% 
endlocal 
echo after endlocal: var=%var% 
exit /b 

:test 
setlocal 
set var=VALUE 3 
echo within local CALL context: var=%var% 
endlocal 
echo within CALL after 1st endlocal: var=%var% 
endlocal 
echo within CALL cannot endlocal to before CALL state: var=%var% 
exit /b 

परिणाम: जब निष्पादन पूरा करता

before call: var=VALUE 2 
within local CALL context: var=VALUE 3 
within CALL after 1st endlocal: var=VALUE 2 
within CALL cannot endlocal to before CALL state: var=VALUE 2 
after call: var=VALUE 2 
after endlocal: var=VALUE 1 
+0

मैं देख रहा हूँ ... सही setlocal के बाद तो मूल रूप से हर सेट आपरेशन साफ ​​हो जाएगा। मै उसे करने की एक कोशिश तो करूंगा। यह चर खुद को साफ़ करने धड़कता है। – ttback

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