बैच सी फ़ाइलों में, मानक सी कार्यक्रमों में, तर्क 0 में वर्तमान में निष्पादित स्क्रिप्ट का पथ शामिल है। आप %~dp0
केवल 0 वें तर्क (जो वर्तमान स्क्रिप्ट है) के केवल पथ भाग को प्राप्त करने के लिए उपयोग कर सकते हैं - यह पथ हमेशा पूरी तरह से योग्य पथ है।
आप उपयोग करके अपने पहले तर्क का पूरी तरह से योग्य मार्ग भी प्राप्त कर सकते हैं %~f1
, लेकिन यह वर्तमान कार्यशील निर्देशिका के अनुसार एक रास्ता देता है, जो स्पष्ट रूप से वह नहीं है जो आप चाहते हैं।
व्यक्तिगत रूप से, मैं अक्सर %~dp0%~1
अपने बैच फ़ाइल में मुहावरे का उपयोग करता हूं, जो निष्पादन बैच के पथ के सापेक्ष पहले तर्क की व्याख्या करता है। हालांकि इसमें एक कमी है: यदि पहला तर्क पूरी तरह से योग्य है तो यह बुरी तरह से विफल हो जाता है।
यदि आपको रिश्तेदार और निरपेक्ष दोनों रास्तों का समर्थन करने की आवश्यकता है , तो आप फ्रेडेरिक मेनेज के समाधान का उपयोग कर सकते हैं : अस्थायी रूप से वर्तमान कार्य निर्देशिका को बदल सकते हैं।
यहाँ एक उदाहरण है जो इन तकनीकों में से प्रत्येक को प्रदर्शित करेगा:
@echo off
echo %%~dp0 is "%~dp0"
echo %%0 is "%0"
echo %%~dpnx0 is "%~dpnx0"
echo %%~f1 is "%~f1"
echo %%~dp0%%~1 is "%~dp0%~1"
rem Temporarily change the current working directory, to retrieve a full path
rem to the first parameter
pushd .
cd %~dp0
echo batch-relative %%~f1 is "%~f1"
popd
यदि आप इसे c: \ temp \ example.bat के रूप में सहेजते हैं और इसे c: \ Users \ Public के रूप में चलाते हैं
c: \ Users \ Public> \ temp \ example.bat .. \ windows
... आप निम्न आउटपुट का अवलोकन करेंगे:
%~dp0 is "C:\temp\"
%0 is "\temp\example.bat"
%~dpnx0 is "C:\temp\example.bat"
%~f1 is "C:\Users\windows"
%~dp0%~1 is "C:\temp\..\windows"
batch-relative %~f1 is "C:\Windows"
बैच तर्क पर अनुमत संशोधक के सेट के लिए प्रलेखन यहां पाया जा सकता है:
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call
realpath
मजबूत पथ के सामान्यीकरण के लिए एनालॉग की भी आवश्यकता होगी ।