सीएमडी/सी एक नई उप-प्रक्रिया शुरू करता है जिसमें इसकी अपनी पर्यावरण की जगह होती है जहां चर मेमोरी में संग्रहीत होते हैं। जब यह प्रक्रिया समाप्त हो जाती है, तो संबंधित पर्यावरण स्थान खो जाता है, इसलिए निश्चित रूप से आप वहां परिभाषित किए गए किसी भी चर की परिभाषा खो देते हैं।
उप-प्रक्रिया के लिए मूल प्रक्रिया के चरों को सीधे एक्सेस या हेरफेर करना संभव नहीं है।
यदि आप एक साधारण कमांड निष्पादित कर रहे हैं और किसी भी आउटपुट पर नियंत्रण रखते हैं, तो आप स्टडीआउट की परिभाषाएं लिख सकते हैं और आउटपुट को आउट/कैप्चर कर सकते हैं ताकि आप अपनी मूल प्रक्रिया में मान सेट कर सकें। लेकिन आपको देरी के विस्तार की आवश्यकता होगी।
नोट - इस उदाहरण बहुत बेहूदा है, लेकिन यह भर
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
विस्तारित किया गया है।
लेकिन मजबूत होने के लिए, आपको यह सुनिश्चित करने के लिए कुछ करना चाहिए कि प्रत्येक तात्कालिकता एक अद्वितीय अस्थायी फ़ाइल नाम का उपयोग करे ताकि एक साथ चलने वाले एक-दूसरे को घुमाए।
आप 'cmd/c" सेट var = hi "' का उपयोग क्यों कर रहे हैं? यह उप-प्रक्रिया में विविधता बनाएगा और चर इसके साथ मर जाएगा। – npocmaka
मैं सराहना करता हूं कि आप एक एमसीवीई का उपयोग कर रहे हैं (गंभीरता से, यह इस टैग पर बहुत दुर्लभ है), लेकिन दुनिया में क्यों आप इस तरह के चर सेट कर रहे हैं? – SomethingDark
@ SomethingDark, यह केवल एक उदाहरण था। वास्तविक उपयोग में, मैं बैच फ़ाइल के अंदर 'कॉल cmd/c "% ~ 0" 'प्रदर्शन करता हूं और फिर जब बैच फ़ाइल निकलती है, तो यह मुख्य स्क्रिप्ट पर वापस आ जाएगी। यह एकमात्र तरीका है जिसे मैं अपने स्वयं को समाप्त करने से बैच फ़ाइल को 'रखने' के बारे में सोच सकता हूं। इसके अतिरिक्त, यदि सीएमडी/सी चर को रखा जाता है तो यह बाकी स्क्रिप्ट को सेट किए गए चरों तक पहुंचने की अनुमति देगा। लंबी व्याख्या soz –