2016-09-21 5 views
5

रखने नहीं क्यों नीचे बैच फ़ाइल चर वहाँ किसी भी तरह से उपयोग करने के लिए अध्यक्ष एवं प्रबंध निदेशक/सी है नहीं रखता जब cmd.exe समाप्त हो जाता हैबैच फ़ाइल चर

@echo off 
cmd /c "set var=hi" 
if defined var (echo var is defined ("var=%var%")) else (echo var isn't defined) 
pause 
exit 

, चर रखने, जबकि? और सीएमडी/सी चर को क्यों नहीं रखता है?

+4

आप 'cmd/c" सेट var = hi "' का उपयोग क्यों कर रहे हैं? यह उप-प्रक्रिया में विविधता बनाएगा और चर इसके साथ मर जाएगा। – npocmaka

+1

मैं सराहना करता हूं कि आप एक एमसीवीई का उपयोग कर रहे हैं (गंभीरता से, यह इस टैग पर बहुत दुर्लभ है), लेकिन दुनिया में क्यों आप इस तरह के चर सेट कर रहे हैं? – SomethingDark

+0

@ SomethingDark, यह केवल एक उदाहरण था। वास्तविक उपयोग में, मैं बैच फ़ाइल के अंदर 'कॉल cmd/c "% ~ 0" 'प्रदर्शन करता हूं और फिर जब बैच फ़ाइल निकलती है, तो यह मुख्य स्क्रिप्ट पर वापस आ जाएगी। यह एकमात्र तरीका है जिसे मैं अपने स्वयं को समाप्त करने से बैच फ़ाइल को 'रखने' के बारे में सोच सकता हूं। इसके अतिरिक्त, यदि सीएमडी/सी चर को रखा जाता है तो यह बाकी स्क्रिप्ट को सेट किए गए चरों तक पहुंचने की अनुमति देगा। लंबी व्याख्या soz –

उत्तर

3

सीएमडी/सी एक नई उप-प्रक्रिया शुरू करता है जिसमें इसकी अपनी पर्यावरण की जगह होती है जहां चर मेमोरी में संग्रहीत होते हैं। जब यह प्रक्रिया समाप्त हो जाती है, तो संबंधित पर्यावरण स्थान खो जाता है, इसलिए निश्चित रूप से आप वहां परिभाषित किए गए किसी भी चर की परिभाषा खो देते हैं।

उप-प्रक्रिया के लिए मूल प्रक्रिया के चरों को सीधे एक्सेस या हेरफेर करना संभव नहीं है।

यदि आप एक साधारण कमांड निष्पादित कर रहे हैं और किसी भी आउटपुट पर नियंत्रण रखते हैं, तो आप स्टडीआउट की परिभाषाएं लिख सकते हैं और आउटपुट को आउट/कैप्चर कर सकते हैं ताकि आप अपनी मूल प्रक्रिया में मान सेट कर सकें। लेकिन आपको देरी के विस्तार की आवश्यकता होगी।

नोट - इस उदाहरण बहुत बेहूदा है, लेकिन यह भर

for /f "delims=" %%A in ('cmd /v:on /c "set var=hi&echo "var=!var!""') do set %%A 

बिंदु मिलना चाहिए लेकिन चीजें की पहचान क्या उद्धृत किया गया है, क्या भाग निकले किए जाने की आवश्यकता के रूप में जहाँ तक आप जटिल कर सकते हैं, ...

यदि आप एक बैच स्क्रिप्ट बनाते हैं जो काम करता है और इसे FOR/F के साथ निष्पादित करता है तो जीवन को सरल बनाया जा सकता है।

test.bat

@echo off 
set var1=hi 
set var2=Ain't this fun 
set var3=bye 
setlocal enableDelayedExpansion 
for %%V in (var1 var2 var3) do echo "%%V=!%%V!" 

main.bat

@echo off 
for /f "delims=" %%A in ('cmd /c test.bat') do set %%A 

वास्तव में, के लिए/एफ एक अंतर्निहित अध्यक्ष एवं प्रबंध निदेशक/सी का उपयोग करता है, और आप नहीं रह में देरी विस्तार सक्षम करने की आवश्यकता आदेश, ताकि आप स्पष्ट सीएमडी/सी

@echo off 
for /f "delims=" %%A in ('test.bat') do set %%A 
को हटा सकते हैं

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

test2.bat

@echo off 
set var1=hi 
set var2=Ain't this fun 
set var3=bye 
echo Here is some output that must be preserved, unrelated to variables 
setlocal enableDelayedExpansion 
(for %%V in (var1 var2 var3) do echo "%%V=!%%V!") >"%temp%\vars.temp" 

मुख्य। बल्ले

@echo off 
setlocal disableDelayedExpansion 
cmd /c test2.bat 
call "%temp%\vars.bat" 
for /f "usebackq delims=" %%V in ("%temp%\vars.temp") do set "%%V" 
del "%temp%\vars.temp" 

ध्यान दें कि देरी विस्तार मुख्य प्रक्रिया में निष्क्रिय किया जाना चाहिए जब आप चर लोड, अन्यथा आप valu में किसी भी ! पात्रों खो देंगे es जब %%V विस्तारित किया गया है।

लेकिन मजबूत होने के लिए, आपको यह सुनिश्चित करने के लिए कुछ करना चाहिए कि प्रत्येक तात्कालिकता एक अद्वितीय अस्थायी फ़ाइल नाम का उपयोग करे ताकि एक साथ चलने वाले एक-दूसरे को घुमाए।

+1

वास्तविक उपयोग में, मैं बैच फ़ाइल के अंदर 'cmd/c "% ~ 0" कॉल करता हूं और फिर जब बैच फ़ाइल निकलती है, तो यह मुख्य स्क्रिप्ट पर वापस आ जाएगी। यह एकमात्र तरीका है जिसे मैं अपने स्वयं को समाप्त करने से बैच फ़ाइल को 'रखने' के बारे में सोच सकता हूं। इसके अतिरिक्त, यदि सीएमडी/सी चर को रखा जाता है तो यह बाकी स्क्रिप्ट को सेट किए गए चरों तक पहुंचने की अनुमति देगा। क्या आप किसी भी अन्य समाधान के बारे में सोच सकते हैं जो बैच फ़ाइल को पर्यावरण की जगह रखने के दौरान स्वयं को कॉल करने की अनुमति दे सकता है? –

+0

@ बर्नरीरिली - बस अपनी स्क्रिप्ट की शुरुआत में 'सेटलोकल' जोड़ें और स्क्रिप्ट के अंदर सेट होने वाले सभी चर स्क्रिप्ट समाप्त हो जाने के बाद अनसेट हो जाएंगे। – SomethingDark

+0

@BurnieRiley - मेरा संपादित उत्तर देखें। – dbenham