कमांड लाइन .cmd / .bat स्क्रिप्ट, रनिंग स्क्रिप्ट की डायरेक्टरी कैसे प्राप्त करें


80

आप उस स्क्रिप्ट की निर्देशिका कैसे प्राप्त कर सकते हैं जो चलाया गया था और .cmd फ़ाइल के भीतर इसका उपयोग करें?


जवाबों:


58

रेमंड चेन के कुछ विचार हैं:

https://devblogs.microsoft.com/oldnewthing/20050128-00/?p=36573

यहाँ पूर्ण रूप से उद्धृत क्योंकि MSDN अभिलेखागार कुछ अविश्वसनीय हैं:

आसान तरीका %CD%छद्म चर का उपयोग करना है । यह वर्तमान कार्यशील निर्देशिका में फैलता है।

set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory

(बेशक, डायरेक्टरी सेव / रिस्टोर अधिक आसानी से pushd/ के साथ किया जा सकता था popd, लेकिन यहां बात नहीं है।)

%CD%चाल कमांड लाइन से काम भी है। उदाहरण के लिए, मैं अक्सर खुद को एक निर्देशिका में पाता हूं, जहां एक फाइल है जिसे मैं चालू करना चाहता हूं लेकिन ... ओह, मुझे उस ऑपरेशन को करने के लिए कुछ अन्य निर्देशिका में chdir करने की आवश्यकता है।

set _=%CD%\curfile.txt
cd ... some other directory ...
somecommand args %_% args

(मैं %_%अपने खरोंच पर्यावरण चर के रूप में उपयोग करना पसंद करता हूं।)

SET /?कमांड प्रोसेसर द्वारा प्रदान किए गए अन्य छद्म चर देखने के लिए टाइप करें।

इसके अलावा लेख में टिप्पणियाँ इस तरह से उदाहरण के लिए स्कैन करने के लायक हैं (WayBack मशीन के माध्यम से, क्योंकि टिप्पणियां पुराने लेखों से चली गई हैं):

http://blogs.msdn.com/oldnewthing/archive/2005/01/28/362565.aspx#362741

इसमें% ~ dp0 के उपयोग को शामिल किया गया है:

यदि आप जानना चाहते हैं कि बैच फ़ाइल कहाँ रहती है: %~dp0

%0बैच फ़ाइल का नाम है। ~dpआपको निर्दिष्ट तर्क की ड्राइव और पथ देता है।


13
इस सवाल का जवाब नहीं है। % CD% वर्तमान निर्देशिका देता है, जबकि जो पूछा गया वह स्क्रिप्ट की निर्देशिका थी।
केटोरिन

3
@ketorin: यह करता है इस सवाल का जवाब। यदि स्क्रिप्ट ही यह के उपयोग के दौरान निर्देशिका बदलने% सीडी% बदल जाएगा (pushd / सीडी / ..) लेकिन % ~ dp0 होगा नहीं जहां स्क्रिप्ट स्थित है इंगित बदल सकते हैं और हमेशा।
Jay

-1 मैं नहीं बता सकता कि यह सवाल का जवाब देता है या नहीं। क्या आप मुझे एक उदाहरण दिखा सकते हैं?
इयान सैमुअल मैकलीन एल्डर

1
@ आईनेदर - आप शायद सही कह रहे हैं, मैंने कुछ दिनों पहले इस जवाब पर दोबारा गौर किया और इससे बहुत खुश नहीं था। रेमंड चेन के ब्लॉग पर टिप्पणी, जिसे मैं संदर्भित करता हूं, प्रतीत होता है कि एमएस द्वारा बमबारी की गई थी - इसलिए उन उत्तरों के खतरों को झूठ है जो पूरी तरह से जुड़े बाहरी स्रोतों पर भरोसा करते हैं। मैंने अपने उत्तर का समर्थन करने के लिए कुछ अन्य सामग्री खोजने की कोशिश की, लेकिन अब बहुत समय पहले की बात है। हटाने के लिए फ्लैगिंग। मुझे इस एक के साथ किनारे पर बांधने के लिए धन्यवाद :) आप स्काईस्कैनर के लिए काम करने के लिए नहीं होते हैं क्या आप?
केव

1
यदि आप स्टैक ओवरफ्लो में सहायक भाग की नकल करते हैं, तो क्या बाहरी स्रोतों को संदर्भित करना ठीक है। मुझे लगता है कि अब बहुत देर हो चुकी है! और हाँ, मैं स्काईस्कैनर डेटा सेंटर में दुबकना करने के लिए जाना जाता हूं ;-)
इयान सैम्युएल मैकलीन एल्डर

147

यह स्क्रिप्ट के पथ के बराबर है:

%~dp0

यह बैच पैरामीटर एक्सटेंशन सिंटैक्स का उपयोग करता है। पैरामीटर 0 हमेशा ही स्क्रिप्ट है।

यदि आपकी स्क्रिप्ट संग्रहीत है C:\example\script.bat, तो इसका %~dp0मूल्यांकन करता है C:\example\

ss64.com में पैरामीटर एक्सटेंशन सिंटैक्स के बारे में अधिक जानकारी है। यहाँ प्रासंगिक अंश है:

आप कमांड लाइन पर संख्यात्मक स्थिति के बाद% का उपयोग करके किसी भी पैरामीटर का मान प्राप्त कर सकते हैं।

[...]

जब किसी फ़ाइलनाम की आपूर्ति के लिए एक पैरामीटर का उपयोग किया जाता है तो निम्नलिखित विस्तारित सिंटैक्स लागू किया जा सकता है:

[...]

% ~ d1 केवल ड्राइव अक्षर पर% 1 ​​का विस्तार करें - C:

[...]

% ~ p1 केवल एक पथ के लिए% 1 का विस्तार करें जैसे \ utils \ इसमें एक अनुगामी \ _ शामिल होता है, जिसे कुछ आदेशों द्वारा पलायन चरित्र के रूप में व्याख्या किया जा सकता है।

[...]

उपरोक्त संशोधक संयुक्त हो सकते हैं:

% ~ dp1 एक ड्राइव अक्षर और पथ पर% 1 ​​का विस्तार करें

[...]

आप% 0 के साथ ही बैच स्क्रिप्ट का पाथनेम प्राप्त कर सकते हैं, पैरामीटर एक्सटेंशन इस पर लागू हो सकते हैं% ~ dp0 बैच स्क्रिप्ट जैसे ड्राइव और पाथ को लौटा देगा जैसे W: \ script \


बिल्कुल वही जो मुझे चाहिए था। और मैंने इस ब्लॉगर को अपने ब्लॉग से एक अनुस्मारक के रूप में जोड़ा :) :)
ओलिवियर एच

निश्चित नहीं है कि यह उद्धृत पाठ में बग / त्रुटि है, लेकिन मेरी स्क्रिप्ट में मुझे ड्राइव अक्षर प्राप्त करने के लिए "% ~ d0" की आवश्यकता है! % ~ d1 मेरे मामले में खाली है।
फकलप्पन

मेरी नजर / स्थिति में यह स्वीकृत उत्तर से बेहतर है। यदि आप एक कमांड लाइन स्क्रिप्ट "एडमिनिस्ट्रेटर" (उस पर राइट क्लिक करें) चलाते हैं, तो आपकी स्क्रिप्ट विंडोज \ system32 से निष्पादित की जाएगी। स्वीकृत उत्तर आपको स्क्रिप्ट स्थान नहीं देगा, यह आपको फिर से Windows \ system32 देगा। यानी यह उत्तर आपको ठीक करने में मदद करता है, आप अपनी स्क्रिप्ट को cd% ~ dp0 से शुरू करते हैं
Jaroslav Záruba

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