वर्तमान बैचफाइल निर्देशिका प्राप्त करें


283

सबसे पहले, मैंने इस विषय को देखा लेकिन मैं इसे समझ नहीं पाया।

सवाल :

D:\path\to\file.batनिम्नलिखित सामग्री के साथ एक बैच फ़ाइल है:

echo %cd%
pause

आउटपुट है:

C:\

यह होना चाहिए D:\path\to

मैं क्या गलत कर रहा हूं?


7
आपको किसी प्रश्न के सभी उत्तरों को पढ़ना चाहिए, विशेष रूप से उच्च मत प्राप्तकर्ताओं को, न कि केवल स्वीकृत एक को। आपके पोस्ट किए गए लिंक पर उच्चतम स्कोर के साथ उत्तर पहले से ही आपके प्रश्न का उत्तर देता है।
दिनभन

4
यदि आप c: \ में हैं, जब आप बैच फ़ाइल का नाम टाइप करते हैं तो c: \ क्या% cd% प्रिंट होगा।
foxidrive

जवाबों:


496

सिस्टम रीड-ओनली वेरिएबल %CD%बैच के कॉल करने वाले का रास्ता रखता है, बैच फाइल लोकेशन का नहीं।

आप %0(जैसे scripts\mybatch.bat) के साथ उपयोगकर्ता द्वारा टाइप किए गए बैच स्क्रिप्ट का नाम स्वयं प्राप्त कर सकते हैं । पैरामीटर एक्सटेंशन इस पर लागू हो सकते हैं इसलिए %~dp0ड्राइव और पाथ को बैच स्क्रिप्ट (जैसे W:\scripts\) पर %~f0लौटाएंगे और पूर्ण पथनाम (जैसे W:\scripts\mybatch.cmd) वापस कर देंगे ।

आप इस सिंटैक्स का उपयोग करके बैच स्क्रिप्ट के समान फ़ोल्डर में अन्य फ़ाइलों का उल्लेख कर सकते हैं:

CALL %0\..\SecondBatch.cmd

यह सबरूटीन में भी इस्तेमाल किया जा सकता है, Echo %0कॉल लेबल देगा लेकिन, echo "%~nx0"आपको बैच स्क्रिप्ट का फ़ाइल नाम देगा।

जब %0चर का विस्तार किया जाता है, तो परिणाम उद्धरण चिह्नों में संलग्न होता है।

बैच मापदंडों पर अधिक


1
देखिए, मुझे अंदर भागने की जरूरत नहीं stm.sqlहै D:\Dir1\Dir2\stm.sql। मुझे mysql.exe -u root -p mysql < %cd%\stm.sqlउस stm.sql कमांड को निष्पादित करने की आवश्यकता है।
कामरेड

@HamedKamrava क्या यह मेरे SQL बैच के लिए है? बैच फ़ाइल की तरह *.batया नहीं *.sh?
स्टोलग

@ Stoleg- में तथ्य, वहाँ में 2 फ़ाइलें हैं D:\Dir1\Dir2\batchfile.batऔर D:\Dir1\Dir2\stm.sql। batchfile.bat सामग्री है: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sqlऔर stm.sql सामग्री कुछ MySQL कमांड है।
कामरेड

1
सिस्टम रीड-ओनली वेरिएबल% CD% बैच के कॉलर का पथ रखता है, बैच फ़ाइल लोकेशन नहीं।
स्टोलग

34
echo %~dp0बैच स्थान पर वापसी का रास्ता होगा। echo %~f0फ़ाइल नाम के साथ बैच में वापसी करेगा।
स्टोलग

119

बहुत आसान:

setlocal
cd /d %~dp0
File.exe

9
कोड छोटा है लेकिन इसे समझना आसान नहीं है। यह File.exe क्या है? क्या वर्तमान निर्देशिका पथ% ~ dp0 में संग्रहीत है?
इवैलो बार्डारोव

यह जवाब वास्तव में सवाल का जवाब देता है, मुझे लगता है। कुडोस।
macetw

3
मैं सिर्फ इस्तेमाल किया cd /d %~dp0बैच फ़ाइल की पहली पंक्ति और काम के रूप में
MKB

सेट्लोकल की आवश्यकता क्यों है? यह उसके बिना भी अच्छी तरह से लौटता है?
टोडुआ

1
@ T.Todua "सेट्लोकल" किसी भी पर्यावरण परिवर्तन का कारण बनता है, जिसमें वर्तमान निर्देशिका भी शामिल है जब तक कि बैच फ़ाइल समाप्त नहीं होती है या "एंडलोकल" का सामना नहीं किया जाता है। यदि आप पर्यावरण चर या वर्तमान निर्देशिका को बदलने जा रहे हैं, तो यह अच्छा रूप है।
जेमी

30

आपकी .bat फ़ाइल के भीतर:

set mypath=%cd%

अब आप %mypath%फ़ाइल के लिए फ़ाइल पथ को संदर्भित करने के लिए चर का उपयोग कर सकते हैं .bat। सत्यापित करने के लिए पथ सही है:

@echo %mypath%

उदाहरण के लिए, DIR.batनिम्नलिखित सामग्रियों के साथ एक फ़ाइल

set mypath=%cd%
@echo %mypath%
Pause

निर्देशिका g:\test\batसे चलाएँ DOS कमांड विंडो में उस पथ को प्रतिध्वनित करेगा।


1
यह सबसे अच्छा और सरल उपाय है
नानी

7
यह एक अच्छा समाधान नहीं है क्योंकि यह उस बैच स्क्रिप्ट को ध्यान में नहीं रखता है जिसे किसी अन्य पथ से किसी अन्य फ़ाइल से कॉल किया जा रहा है।
TheQuestionMan

यह भी जब ऊंचे अनुमतियों के रूप में चलाया जाता है तो% cd% रिटर्न C: \ Windows \ system32 लेकिन निर्देशिका नहीं जहां यह संग्रहीत है।
प्रवीणदास

9

यहाँ मैं अपने सभी बैच फ़ाइलों के शीर्ष पर उपयोग कर रहा हूँ। मैं सिर्फ अपने टेम्पलेट फ़ोल्डर से कॉपी / पेस्ट करता हूं।

@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"

वर्तमान बैच फ़ाइल का% बैटडी% पर सेट करने से आप इसे वर्तमान बैच फ़ाइल में बाद के चरणों में कॉल कर सकते हैं, भले ही यह बैच फ़ाइल में परिवर्तन हो। PUSHD का उपयोग करने से आप इस बैच फ़ाइल के पथ को मूल% batdir% में जल्दी से सेट करने के लिए POPD का उपयोग कर सकते हैं। याद रखें, अगर% बैटडीर% एक्सट्राडिर या% बैटडीर% \ एक्स्ट्राडिर का उपयोग करते हुए (निर्भर करता है कि कौन सा संस्करण ऊपर इस्तेमाल किया गया है, बैकस्लैश समाप्त हो रहा है या नहीं) आपको पूरे स्ट्रिंग को दोहरे उद्धरणों में संलग्न करने की आवश्यकता होगी यदि पथ में रिक्त स्थान है (यानी "% बैटडी%% अतिरिक्त" )। आप हमेशा PUSHD% ~ dp0 का उपयोग कर सकते हैं। [https: // ss64.com/ nt / syntax-args .html] पर (% ~) मापदंडों पर अधिक है।

ध्यान दें कि एक लाइन की शुरुआत में (: :) इसका उपयोग एक टिप्पणी लाइन बनाता है। अधिक महत्वपूर्ण बात यह है कि :: आप उस टिप्पणी में पुनर्निर्देशकों, पाइपों, विशेष वर्णों (अर्थात <> आदि) को शामिल करने की अनुमति देते हैं।

:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt

बेशक, Powershell यह और बहुत अधिक करता है।


2
महान जवाब, बहुत बहुत धन्यवाद! :-) बस अपनी दूसरी तकनीक से सावधान रहें ( set batdir=%CD%)। यह ठीक नहीं है, क्योंकि यह कॉल करने वाले का रास्ता है, न कि खुद बैट फाइल का। निष्पादन योग्य बल्ले फ़ाइल के लिए पथ प्राप्त करने का एकमात्र वैध तरीका है %~dp0
मिच मैकमाबर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.