Windows बैच फ़ाइल में% ~ d0 का क्या अर्थ है?


353

मैं एक बैच फ़ाइल देख रहा हूँ जो निम्नलिखित चर को परिभाषित करती है:

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • क्या %~d0या %~p0वास्तव में क्या मतलब है?
  • क्या किसी स्क्रिप्ट की वर्तमान निर्देशिका, ड्राइव, पैरामीटर जैसी चीजों के लिए प्रसिद्ध मूल्यों का एक सेट है?
  • क्या कोई अन्य समान शॉर्टकट हैं जिनका मैं उपयोग कर सकता हूं?

जवाबों:


539

जादू चर %n शामिल फ़ाइल आह्वान करने के लिए इस्तेमाल किया तर्क: %0बैट फ़ाइल स्वयं करने के लिए पथ, है %1, के बाद पहला तर्क है %2दूसरी और इतने पर है।

चूंकि तर्क अक्सर फ़ाइल पथ होते हैं, इसलिए पथ के कुछ हिस्सों को निकालने के लिए कुछ अतिरिक्त वाक्यविन्यास होता है। ~dड्राइव है, ~pपथ है (ड्राइव के बिना), ~nफ़ाइल नाम है। उन्हें जोड़ा जा सकता है इसलिए ~dpड्राइव + पाथ है।

%~dp0 इसलिए बल्ले में बहुत उपयोगी है: यह वह फ़ोल्डर है जिसमें निष्पादन करने वाली बैट फाइल रहती है।

आप फ़ाइल के बारे में अन्य प्रकार की मेटा जानकारी भी प्राप्त कर सकते हैं: ~tटाइमस्टैम्प ~zहै, आकार है।

सभी कमांड लाइन कमांड के संदर्भ के लिए यहां देखें । टिल्ड-जादू कोड के तहत वर्णित हैं के लिए


15
स्वयं पर ध्यान दें: echo %~dp0केवल एक बैच फ़ाइल में कमांड लाइन पर काम नहीं करेगा। ओह!
उत्तरबेन

2
क्या आपस में %~d0और कोई फर्क है %~d0%?
ज्योफ्री

2
@ स्पेसर:% 0 स्क्रिप्ट का फ़ाइल नाम सहित पूर्ण पथ है। % ~ dp0 स्क्रिप्ट वाले फ़ोल्डर का पथ है लेकिन स्क्रिप्ट के फ़ाइल नाम को छोड़कर।
जैक्सबी 19

4
स्वयं पर ध्यान दें: echo %~pd0इको के रूप में एक ही आउटपुट देता है %~dp0(बजाय उलटा अपेक्षा के अनुसार)। इसके अलावा, का मूल्य %0है आप डबल क्लिक करें कि क्या आधार पर अलग अलग बैच फ़ाइल या cmd से चलाने के।
पचेरियर

152

वे परिवर्तनशील चर प्रतिस्थापन हैं। वे बैच फ़ाइलों में उपयोग किए गए% N चर को संशोधित करते हैं। यदि आप Windows में बैच प्रोग्रामिंग में हैं तो काफी उपयोगी है।

%~I         - expands %I removing any surrounding quotes ("")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

आप दौड़ कर ऊपर पा सकते हैं FOR /?


48

हां, अन्य शॉर्टकट हैं जो आप उपयोग कर सकते हैं जो नीचे दिए गए हैं। आपके आदेश में, ~ d0 का अर्थ होगा 0 वें तर्क का ड्राइव अक्षर।

~ expands the given variable
d gets the drive letter only
0 is the argument you are referencing

जैसा कि 0 वां तर्क स्क्रिप्ट पथ है, इसे आपके लिए पथ का ड्राइव अक्षर मिलता है। आप निम्न शॉर्टकट भी उपयोग कर सकते हैं।

%~1         - expands %1 removing any surrounding quotes (")
%~f1        - expands %1 to a fully qualified path name
%~d1        - expands %1 to a drive letter only
%~p1        - expands %1 to a path only
%~n1        - expands %1 to a file name only
%~x1        - expands %1 to a file extension only
%~s1        - expanded path contains short names only
%~a1        - expands %1 to file attributes
%~t1        - expands %1 to date/time of file
%~z1        - expands %1 to size of file
%~$PATH:1   - searches the directories listed in the PATH
               environment variable and expands %1 to the fully
               qualified name of the first one found.  If the
               environment variable name is not defined or the
               file is not found by the search, then this
               modifier expands to the empty string    

%~dp1       - expands %1 to a drive letter and path only
%~nx1       - expands %1 to a file name and extension only
%~dp$PATH:1 - searches the directories listed in the PATH
               environment variable for %1 and expands to the
               drive letter and path of the first one found.
%~ftza1     - expands %1 to a DIR like output line

जब आप CALL / चलाते हैं तो यह सीधे कमांड प्रॉम्प्ट में पाया जा सकता है? या के लिए /?


12

बैच फ़ाइल और अधिक मुहावरों में फाइलनाम पार्सिंग से - रियल का हाव-भाव :

वह पथ (बिना ड्राइव) जहां स्क्रिप्ट है: ~ p0

वह ड्राइव जहां स्क्रिप्ट है: ~ d0


ग्रेट लिंक और जानकारी ~ [मुहावरे] पर। साथ ही बताते हैं %~s0, पूरा स्क्रिप्ट नाम।
लॉरी स्टर्न

9

एक और टिप जो बहुत मदद करेगी कि वर्तमान निर्देशिका को एक अलग ड्राइव पर सेट करने के लिए %~d0पहले उपयोग करना होगा , फिर cd %~dp0। यह निर्देशिका को बैच फ़ाइल के ड्राइव में बदल देगा, फिर उसके फ़ोल्डर में बदल देगा।

#OneLinerLovers के लिए, cd /d %~dp0ड्राइव और निर्देशिका दोनों को बदल देगा :)

आशा है कि यह किसी की मदद करता है।


7
एक अन्य विकल्प है pushd %~dp0, जिसे वर्तमान ड्राइव को बदलने में कोई समस्या नहीं है, और आपको popdमूल ड्राइव / पथ पर वापस जाने में सक्षम होने का जोड़ा बोनस देता है ।
bcrist


6

कुछ गोटेक के लिए बाहर देखने के लिए:

यदि आप डबल-क्लिक%0 करेंगे तो बैच फ़ाइल को उद्धरणों से घेर लिया जाएगा। उदाहरण के लिए, यदि आप इस फ़ाइल को इस रूप में सहेजते हैं c:\test.bat:

@echo %0
@pause

डबल-क्लिक करने से आउटपुट के साथ एक नया कमांड प्रॉम्प्ट खुलेगा:

"C:\test.bat"

लेकिन अगर आप पहली बार कमांड प्रॉम्प्ट खोलते हैं और इसे सीधे उस कमांड प्रॉम्प्ट से कॉल करते हैं, %0तो आप जो भी टाइप करेंगे उसे संदर्भित करेंगे । यदि आप लिखते हैं test.batEnter, तो आपके %0पास कोई उद्धरण नहीं होने के कारण कोई उद्धरण नहीं होगा:

c:\>test.bat
test.bat

यदि आप टाइप करते हैं testEnter, तो आउटपुट का %0कोई एक्सटेंशन नहीं होगा, क्योंकि आपने कोई एक्सटेंशन टाइप नहीं किया है:

c:\>test
test

उसी के लिए tEsTEnter:

c:\>tEsT
tEsT

यदि आप टाइप करते हैं "test"Enter, तो आउटपुट में %0उद्धरण होंगे (चूंकि आपने उन्हें टाइप किया था) लेकिन कोई एक्सटेंशन नहीं:

c:\>"test"
"test"

अंत में, यदि आप टाइप करते हैं "C:\test.bat", तो आउटपुट बिल्कुल वैसा ही होगा जैसा आपने डबल क्लिक किया है:

c:\>"C:\test.bat"
"C:\test.bat"

ध्यान दें कि ये सभी संभावित मूल्य नहीं हो %0सकते हैं क्योंकि आप स्क्रिप्ट को अन्य फ़ोल्डरों से कॉल कर सकते हैं:

c:\some_folder>/../teST.bAt
/../teST.bAt

ऊपर दिखाए गए सभी उदाहरण भी प्रभावित करेंगे %~0, क्योंकि का आउटपुट %~0केवल %0 माइनस कोट्स (यदि कोई हो) का आउटपुट है ।


3

यह कोड ~ टिल्डा चरित्र के उपयोग के बारे में बताता है, जो मेरे लिए सबसे अधिक भ्रमित करने वाली बात थी। एक बार जब मैं यह समझ गया, तो यह समझने में बहुत आसान हो गया है:

@ECHO off
SET "PATH=%~dp0;%PATH%"
ECHO %PATH%
ECHO.
CALL :testargs "these are days" "when the brave endure"
GOTO :pauseit
:testargs
SET ARGS=%~1;%~2;%1;%2
ECHO %ARGS%
ECHO.
exit /B 0
:pauseit
pause

1

यह फ़ाइल या निर्देशिका के वर्तमान स्थान को प्रदर्शित करता है जो आप वर्तमान में हैं। उदाहरण के लिए; अगर आपकी बैच फ़ाइल डेस्कटॉप निर्देशिका में थी, तो "% ~ dp0" डेस्कटॉप निर्देशिका प्रदर्शित करेगा। यदि आप चाहते थे कि यह वर्तमान निर्देशिका को वर्तमान फ़ाइल नाम के साथ प्रदर्शित करे तो आप "% ~ dp0% ~ n0% ~ x0" टाइप कर सकते हैं।


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