विंडोज में बैच स्क्रिप्ट का मार्ग कैसे प्राप्त करें?


329

मुझे पता है कि %0बैच स्क्रिप्ट का पूरा पथ शामिल है, उदाहरण के लिएc:\path\to\my\file\abc.bat

मैं pathबराबर होगाc:\path\to\my\file

मैं इसे कैसे हासिल कर सकता हूं?




1
BTW:% 0 में पूर्ण पथ सम्‍मिलित नहीं है, यदि बल्ला किसी रिलेटिव कमांड लाइन के साथ कहा जाता है। इसलिए "% ~ dpf0" इस मामले के लिए अधिक विश्वसनीय होगा।
Eckes

जवाबों:


562

%~dp0निर्देशिका होगी। यहाँ सभी पथ प्रदर्शकों पर कुछ प्रलेखन है । मजेदार चीजें :-)

अंतिम बैकस्लैश को हटाने के लिए, आप :n,mसब्स्ट्रिंग सिंटैक्स का उपयोग कर सकते हैं , जैसे:

SET mypath=%~dp0
echo %mypath:~0,-1%

मुझे विश्वास नहीं है कि %0वाक्यविन्यास के साथ वाक्यविन्यास को संयोजित करने का एक तरीका है :~n,m, दुर्भाग्य से।


7
बहुत बढ़िया ... मैं उपयोग कर रहा हूँ %~0\..- जानता था कि एक बेहतर तरीका होना चाहिए! इसके अलावा, आप संभवतः %~dp0दोहरे उद्धरण चिह्नों ( "") के मामले में निर्देशिका नाम में रिक्त स्थान, इत्यादि संलग्न करना चाहते हैं
कैमरन

1
अच्छा लगा! लेकिन, %~dp0अंत में `` शामिल हैं। क्या आपको अंदाजा है कि इसे कैसे हटाया जाए?
मिशा मोरको

1
@ मिशा: मेरा मतलब है कि आप अंत में '\' को हटाना चाहते हैं। मैंने विवरण के साथ अपना उत्तर अपडेट कर दिया है।
डीन हार्डिंग

2
पथ में जगह होने पर भी उत्तर में उदाहरण बिना उद्धरण चिह्नों के ठीक काम करता है। (जैसे SET msg=hello worldठीक काम करता है)। हालाँकि,% mypath% का कहीं और उपयोग करते समय आप इसे उद्धरणों में उपयोग करने के लिए सावधान रहना चाहते हैं, हालाँकि इनकी आवश्यकता cdभी नहीं है।
मार्टिन दर्द

2
वह लिंक अब 404 है
स्टिंगजैक

12

"\" अनुगामी के बिना पथ प्राप्त करने के लिए आप निम्न स्क्रिप्ट का उपयोग कर सकते हैं

for %%i in ("%~dp0.") do SET "mypath=%%~fi"

यह फ़ाइल नाम को पथ से नहीं हटाता है (उदाहरण के लिए OP के उदाहरण में abc.txt)।
dcp

4
@dcp एर, हालांकि, यह करता है।
काइल स्ट्रैंड

@ केली स्ट्रैंड - हाँ, मैंने इसे फिर से आजमाया है और अब यह ठीक काम कर रहा है। मुझे यकीन नहीं है कि जब मैंने मूल रूप से कोशिश की तो क्या हुआ, शायद मैंने स्क्रिप्ट में कहीं गलती की। भ्रम के लिए क्षमा करें, और इसे इंगित करने के लिए धन्यवाद।
dcp

11

%~dp0एक सापेक्ष मार्ग हो सकता है। इसे पूर्ण पथ में बदलने के लिए, कुछ इस तरह आज़माएँ:

pushd %~dp0
set script_dir=%CD%
popd

6
ठीक है, तो बस %~dp0सीधे उपयोग क्यों नहीं ?
jpaugh

5
स्वीकृत उत्तर का एक बदतर संस्करण, 5 साल बाद पोस्ट किया गया? मुझे समझ नहीं आ रहा है।
काइल स्ट्रैंड

मुझे लगता है कि यह स्वीकार किए गए उत्तर की टिप्पणियों में वर्णित समस्या को संबोधित करने के लिए पोस्ट किया गया था - %~dp0सापेक्ष हो सकता है, जो उपयोग के मामले के आधार पर समस्या हो सकती है या नहीं भी हो सकती है
माइकल मोजोक

10
%~dp0एक सापेक्ष पथ नहीं हो सकता है, dड्राइव के लिए खड़ा है और pपथ के लिए, एक ड्राइव कैसे सापेक्ष हो सकता है?
जेब

5
किस दुनिया में? मैंने सिर्फ Windows Server 2012 r2 पर इस उत्तर का परीक्षण किया और यह पता चला %~dp0कि स्क्रिप्ट के सापेक्ष पथ के रूप में चलने पर भी यह एक निरपेक्ष पथ होगा। जेब की टिप्पणी के लिए धन्यवाद, मैं इस जवाब से मूर्ख नहीं था। लोग सिर्फ सामान क्यों बनाते हैं और जाते हैं और दूसरों को अपनी जंगली कल्पना फैलाना शुरू करते हैं। मेरे पास यह सहयोगी है जो ऐसा करता है, लेकिन मैंने उसकी (युवा) उम्र को दोषी ठहराया। काश मेरा डाउन-वोट गिना जाता।
बिटूलियन

0

आप उपयोग कर सकते हैं %~dp0 , डी का मतलब केवल ड्राइव है, पी का मतलब केवल पथ है, 0 बैच फ़ाइल के पूर्ण फ़ाइल नाम के लिए तर्क है।

उदाहरण के लिए यदि फ़ाइल पथ C: \ Users \ Oliver \ Desktop \ example.bat था, तो तर्क C: \ Users \ Oliver \ Desktop \ के बराबर होगा, साथ ही आप आदेश set cpath=%~dp0 && set cpath=%cpath:~0,-1%का उपयोग कर सकते हैं और %cpath%अनुगामी स्लैश को हटाने के लिए चर का उपयोग कर सकते हैं ।


1
मैं नहीं किसी भी अधिक जानकारियां देख सकते हैं, 9 साल की उम्र जवाब की तुलना में
जेब

अतिरिक्त जानकारी "d का मतलब है ड्राइव केवल ..." आदि। धन्यवाद, @ Hayz।
आरजे डनिल

-2

%cd% आपको निर्देशिका का रास्ता देगा जहां से स्क्रिप्ट चल रही है।

बस दौडो:

echo %cd%

%CD%वर्तमान कार्यशील फ़ोल्डर है, फ़ोल्डर नहीं, जहां बैच फ़ाइल संग्रहीत है। वे एक ही स्थान हो सकते हैं, लेकिन अक्सर वे नहीं होते हैं।
Stephan

-7

वह %CD%परिवर्तनशील होगा।

@echo off
echo %CD%

%CD% वर्तमान निर्देशिका बैच स्क्रिप्ट में है।


35
% cd% उस निर्देशिका को लौटाता है जो स्क्रिप्ट से चलाया गया था, न कि वह स्क्रिप्ट जो निर्देशिका में है।
Misha Moroshko

4
यह केवल तभी काम करता है जब आपकी स्क्रिप्ट कार्य निर्देशिका को संशोधित नहीं करती है। कोशिश करो CD C:\Temp <CR> ECHO %CD%( <CR>newline है ...)
डीन हार्डिंग

6
इसके अलावा, यदि आप स्क्रिप्ट पर राइट-क्लिक करते हैं और "रन ऐज़ एडमिनिस्ट्रेटर" का चयन करते हैं, तो वर्तमान वर्तमान निर्देशिका C: \ Windows \ System32 है जहां स्क्रिप्ट स्थित है।
कैमरन

हालाँकि यह ओपी के सवाल का सीधा जवाब नहीं है, लेकिन कार्यक्षमता का यह स्वाद ठीक वैसा ही है जैसा मैं इस प्रश्न को पाते समय देख रहा था। धन्यवाद!
ज़ोल्टन

Win7 32bit cmd.exe पर मेरे लिए कोई भी अन्य समाधान पोस्ट नहीं किया गया है, यह मेरे लिए कम से कम उपयोगी है।
क्लिफोर्ड

-8

मैं एक विंडोज 7 मशीन पर काम कर रहा हूं और मैंने अपनी बैश स्क्रिप्ट के लिए पूर्ण फ़ोल्डर पथ प्राप्त करने के लिए नीचे की पंक्तियों का उपयोग किया है।

Http://www.linuxjournal.com/content/bash-parameter-expansion को देखने के बाद मुझे इसका समाधान मिला ।

#Get the full aboslute filename.
filename=$0
#Remove everything after \. An extra \ seems to be necessary to escape something...
folder="${filename%\\*}"
#Echo...
echo $filename
echo $folder

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