एकल बैच-फ़ाइल कमांड के लिए अस्थायी रूप से निर्देशिका बदलें


19

शेल-स्क्रिप्टिंग में यदि मुझे एक निर्देशिका से एक कमांड चलाने की आवश्यकता होती है तो मैं यह सुनिश्चित कर सकता हूं कि मैं मूल संदर्भ पर वापस लौटने के लिए एक उप-सूची बना सकता हूं:

(cd temporary/new/directory ; command)
# now I am still in original directory

यह विंडोज बैच-फाइलों (या cmd- फाइल) में किया जा सकता है

बैच-फाइलों में भी यही करना मुझे नई निर्देशिका में छोड़ देता है।

मैं कर सकता हूँ:

pushd temporary\new\directory && command && popd

लेकिन पोप की सफलता पर निर्भर है command

कोई विचार?


आप अपने "बैच-फाइल" या "cmd-file" को कैसे लागू कर रहे हैं? यदि आप एक cd कमांड को शेल स्क्रिप्ट में रखते हैं और उस स्क्रिप्ट को निष्पादित करते हैं (इसका स्रोत नहीं है), कॉलिंग शेल की वर्तमान कार्यशील निर्देशिका नहीं बदलेगी।
गैरीजोन

बस स्पष्ट होना यह विंडोज़ बैच-फाइलों का जिक्र है।
ग्रेग

इसकी एक स्क्रिप्ट जो एक डायरेक्टरी ट्री के विभिन्न हिस्सों में कमांड का एक गुच्छा चलाती है। कुछ आदेश केवल वर्तमान-निर्देशिका पर काम करते हैं। मूल निर्देशिका पर लौटने से स्क्रिप्ट को चलाने वाले डेटा को सरल बनाने में मदद मिलती है। क्या आप प्रत्येक निर्देशिका के लिए एक अलग बैच-फ़ाइल बनाने का सुझाव दे रहे हैं जिसमें मुझे कॉल करने की आवश्यकता है?
ग्रेग

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

हाँ, क्षमा करें, मुझे एहसास है कि मैं स्पष्ट नहीं था (हालांकि मुझे लगता है कि 'बैच-फ़ाइल' एक संकेत था :-p)
ग्रेग

जवाबों:


21

यदि तुम करो:

pushd \windows && foobar && popd

आपको \ windows फ़ोल्डर में छोड़ दिया जाएगा (जैसा कि आप कहते हैं)। प्रयत्न:

pushd \windows & foobar & popd

और आपको अपने आप को वहीं वापस ढूंढना चाहिए जहां आपने शुरुआत की थी।


1
आह, इसलिए सिंगल एम्परसेंड श में अर्ध-कोलन के बराबर है। यह बिल्कुल सही है। (और एक संदर्भ: ss64.com/nt/syntax-conditional.html )
ग्रेग

6
यह अच्छा याद रखना होगा कि cd/ pushdकभी कभी विफल रहता है (यदि निर्देशिका मौजूद नहीं है, उदाहरण के लिए)। pushd \windows && (foobar & popd)और अधिक विश्वसनीय हो सकता है
user1686

16

डिफ़ॉल्ट रूप से, विंडोज बैच फाइलें पैरेंट शेल के संदर्भ में चलती हैं (जो यूनिक्स उपयोगकर्ताओं के लिए असामान्य है, जहां एक स्पष्ट sourceआवश्यकता है, लेकिन एमएस-डॉस में एकमात्र संभावना थी)। इसका मतलब है कि निर्देशिका परिवर्तन और पर्यावरण चर मूल इंटरएक्टिव शेल को भी प्रभावित करते हैं।

setlocalइसे अपने संदर्भ में चलाने के लिए अपनी स्क्रिप्ट के शीर्ष पर रखें - आप cdतब स्क्रिप्ट के अंदर सुरक्षित रूप से उपयोग कर सकते हैं ।


धन्यवाद, यह लगता है कि मुझे क्या चाहिए - जब मैं विंडोज मशीन तक पहुंच पाऊंगा, तो इसकी जांच करूंगा। क्या कोष्ठक के उपयोग से उप-कमांड प्रभावित होंगे?
ग्रेग

1
@Greg: ऐसा लगता है कि ( )केवल समूह एक साथ आदेश देते हैं, लेकिन फिर भी उन्हें मूल संदर्भ में चलाते हैं। (setlocal & cd foo & bar)काम नहीं करेगा; इसके बजाय pushd foo && (bar & popd)जरूरत होगी।
user1686

4

जैसा कि पहले बताया गया था, pushd \windows && (foobar & popd)इससे बेहतर काम करेगा pushd \windows & foobar & popdक्योंकि ऐसा कोई निर्देशिका नहीं होने पर उत्तरार्द्ध विफल हो सकता है।

इसके अलावा, आपको कई स्थानीय वातावरण का उपयोग करने setlocalऔर endlocalअनुमति देता है, इसलिए उदाहरण के लिए आप हो सकते हैं:

setlocal

cd dir

command

endlocal

अब आप अपनी मूल निर्देशिका में वापस आ जाएंगे।


3

आप cd -पिछली कार्यशील निर्देशिका में वापस जाने के लिए उपयोग कर सकते हैं । और ;इसके बजाय का उपयोग करें &&, तो बाद के आदेश पिछले आदेशों की सफलता पर निर्भर नहीं होंगे।

$ pwd
/etc
$ cd /var ; pwd ; cd -
/var
$ pwd
/etc

मैंने अपडेट करने के लिए प्रश्न को स्पष्ट किया है मैं विंडोज़ बैच / शेल स्क्रिप्टिंग के बारे में पूछ रहा हूं। मुझे पता है कि इसे श-जैसे शेल के तहत कैसे करना है :)
ग्रेग

जैसा कि BillP3rd ने ';' के समकक्ष बताया। बैच-फाइलों में 'और' है।
ग्रेग

आह क्षमा करें। फॉरवर्ड स्लैश के आपके उपयोग से मुझे लगा कि यह UNIX है।
बहमट

1

मैं setlocalआपके बैच स्क्रिप्ट की शुरुआत में ग्रेविटी के सुझाव की सराहना करता हूं , लेकिन मैं इस तथ्य को जोड़ूंगा कि आपके पास एकाधिक, नेस्टेड setlocal/ endlocalब्लॉक हो सकते हैं, इसलिए प्रश्न का अधिक प्रासंगिक उत्तर हो सकता है

@echo off
setlocal
cddir1
  ...
setlocal
cddir2
command
endlocal
:: Now I am back indir1
  ...

और, बेशक, अगर आप आदेश चाहते निष्पादित करने के लिए केवल तभी cdकरने के लिए dir2सफल होता है, कहते हैंcddir2&&command

ध्यान दें कि setlocal/ endlocalब्लॉक एक स्थानीय वातावरण बनाता है, इसलिए आपके द्वारा इस तरह के ब्लॉक में सेट किए गए या परिवर्तन करने वाला कोई भी चर इसके पिछले मूल्य पर वापस आ जाएगा endlocal


0

आप वर्तमान निर्देशिका को एक चर में सहेज सकते हैं। कमांड के वापसी मूल्य के आधार पर वापस बदलें और बदलें। BTW,% CD% आपका वर्तमान DIR लौटाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.