सबसे पहले, मैंने इस विषय को देखा लेकिन मैं इसे समझ नहीं पाया।
सवाल :
D:\path\to\file.bat
निम्नलिखित सामग्री के साथ एक बैच फ़ाइल है:
echo %cd%
pause
आउटपुट है:
C:\
यह होना चाहिए D:\path\to
मैं क्या गलत कर रहा हूं?
सबसे पहले, मैंने इस विषय को देखा लेकिन मैं इसे समझ नहीं पाया।
सवाल :
D:\path\to\file.bat
निम्नलिखित सामग्री के साथ एक बैच फ़ाइल है:
echo %cd%
pause
आउटपुट है:
C:\
यह होना चाहिए D:\path\to
मैं क्या गलत कर रहा हूं?
जवाबों:
सिस्टम रीड-ओनली वेरिएबल %CD%
बैच के कॉल करने वाले का रास्ता रखता है, बैच फाइल लोकेशन का नहीं।
आप %0
(जैसे scripts\mybatch.bat
) के साथ उपयोगकर्ता द्वारा टाइप किए गए बैच स्क्रिप्ट का नाम स्वयं प्राप्त कर सकते हैं । पैरामीटर एक्सटेंशन इस पर लागू हो सकते हैं इसलिए %~dp0
ड्राइव और पाथ को बैच स्क्रिप्ट (जैसे W:\scripts\
) पर %~f0
लौटाएंगे और पूर्ण पथनाम (जैसे W:\scripts\mybatch.cmd
) वापस कर देंगे ।
आप इस सिंटैक्स का उपयोग करके बैच स्क्रिप्ट के समान फ़ोल्डर में अन्य फ़ाइलों का उल्लेख कर सकते हैं:
CALL %0\..\SecondBatch.cmd
यह सबरूटीन में भी इस्तेमाल किया जा सकता है, Echo %0
कॉल लेबल देगा लेकिन, echo "%~nx0"
आपको बैच स्क्रिप्ट का फ़ाइल नाम देगा।
जब %0
चर का विस्तार किया जाता है, तो परिणाम उद्धरण चिह्नों में संलग्न होता है।
stm.sql
है D:\Dir1\Dir2\stm.sql
। मुझे mysql.exe -u root -p mysql < %cd%\stm.sql
उस stm.sql कमांड को निष्पादित करने की आवश्यकता है।
*.bat
या नहीं *.sh
?
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 कमांड है।
echo %~dp0
बैच स्थान पर वापसी का रास्ता होगा। echo %~f0
फ़ाइल नाम के साथ बैच में वापसी करेगा।
बहुत आसान:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0
बैच फ़ाइल की पहली पंक्ति और काम के रूप में
आपकी .bat फ़ाइल के भीतर:
set mypath=%cd%
अब आप %mypath%
फ़ाइल के लिए फ़ाइल पथ को संदर्भित करने के लिए चर का उपयोग कर सकते हैं .bat
। सत्यापित करने के लिए पथ सही है:
@echo %mypath%
उदाहरण के लिए, DIR.bat
निम्नलिखित सामग्रियों के साथ एक फ़ाइल
set mypath=%cd%
@echo %mypath%
Pause
निर्देशिका g:\test\bat
से चलाएँ DOS कमांड विंडो में उस पथ को प्रतिध्वनित करेगा।
यहाँ मैं अपने सभी बैच फ़ाइलों के शीर्ष पर उपयोग कर रहा हूँ। मैं सिर्फ अपने टेम्पलेट फ़ोल्डर से कॉपी / पेस्ट करता हूं।
@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 यह और बहुत अधिक करता है।
set batdir=%CD%
)। यह ठीक नहीं है, क्योंकि यह कॉल करने वाले का रास्ता है, न कि खुद बैट फाइल का। निष्पादन योग्य बल्ले फ़ाइल के लिए पथ प्राप्त करने का एकमात्र वैध तरीका है %~dp0
।