2009-03-11 16 views
168

मैं वर्तमान में चल रहे बैच फ़ाइल का नाम फ़ाइल एक्सटेंशन के बिना प्राप्त करना चाहता हूं।बैच फ़ाइल में एक सबस्ट्रिंग करने का सबसे अच्छा तरीका क्या है?

this link के लिए धन्यवाद, मेरे पास फ़ाइल नाम है एक्सटेंशन के साथ ... लेकिन बैच फ़ाइल में सबस्ट्रिंग करने का सबसे अच्छा तरीका क्या है?

या फ़ाइल नाम w/o एक्सटेंशन प्राप्त करने का कोई और तरीका है?

इस परिदृश्य में 3 अक्षर एक्सटेंशन मानना ​​सुरक्षित है।

उत्तर

346

ठीक है, बस अपने बैच का फ़ाइल नाम प्राप्त करने के लिए सबसे आसान तरीका केवल %~n0 का उपयोग करना होगा।

@echo %~n0 

इच्छा उत्पादन का नाम (विस्तार के बिना) वर्तमान में चल रहे बैच फ़ाइल (जब तक कि एक सबरूटीन call से बुलाया में मार डाला) की। पथ नाम के लिए इस तरह के "विशेष" प्रतिस्थापन की पूरी सूची help for साथ पाया जा सकता है, मदद के अंत में:

इसके अलावा, के लिए वैरिएबल संदर्भ का प्रतिस्थापन बढ़ाया गया है।

%~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 

संशोधक जोड़ा जा सकता है पाने के लिए यौगिक परिणाम::

%~dpI  - expands %I to a drive letter and path only 
%~nxI  - expands %I to a file name and extension only 
%~fsI  - expands %I to a full path name with short names only 

ठीक, आपके प्रश्न का उत्तर देने तथापि: सबस्ट्रिंग का उपयोग किया जाता है अब आप निम्नलिखित वैकल्पिक सिंटैक्स का उपयोग कर सकते हैं :~start,length नोटेशन:

%var:~10,5% 

पर्यावरण चर %var% में स्थिति 10 से 5 वर्ण निकालेगा।

नोट: तार के सूचकांक शून्य आधारित है, इसलिए पहले वर्ण स्थिति 0, 1 पर दूसरा, आदि पर है

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

:: Does not work: 
@echo %1:~10,5 

:: Assign argument to local variable first: 
set var=%1 
@echo %var:~10,5% 

वाक्य रचना और भी अधिक शक्तिशाली है:

  • %var:~-7% से %var%
  • %var:~0,-4% पिछले 7 वर्ण निकालता है पिछले चार जो भी फाइल एक्सटेंशन (अवधि [.] के बाद तीन पात्रों कल्पना करते हुए) की आप छुटकारा चाहते हैं को छोड़कर सभी पात्रों को निकालने होगा।

उस वाक्यविन्यास के विवरण के लिए help set देखें।

+0

यह एक अच्छा, संपूर्ण जवाब है। बहुत बहुत धन्यवाद। – JosephStyons

+0

ठीक है, अब वे तीन जवाब हैं, पैट्रिक के लिए धन्यवाद :) – Joey

+18

सबस्ट्रिंग निष्कर्षण फोर लूप चर के साथ काम नहीं करता है, इसलिए आपको निम्नानुसार करना होगा (\ r \ n कोड माध्य रेखा में तोड़ता है क्योंकि एसओ टिप्पणियों में लाइन ब्रेक की इजाजत नहीं देता है): 'setlocal ENABLEDELAYEDEXPANSION \ r \ n /f %% s (' set ') के लिए (\ r \ n \t सेट tmp = %% s \ r \ n \t गूंज! Tmp: ~ -3! \ R \ n ) ' – Fr0sT

26

अच्छी तरह से ऊपर समझाया गया!

उन सभी जो एक स्थानीय Windows में यह काम कर पाने के लिए मेरे जैसे पीड़ित हो सकता है के लिए, आप एक !

तो साथ % को बदलने के लिए कोशिश कर सकते हैं (मेरा स्लोवाक में XP है):

SET TEXT=Hello World 
SET SUBSTRING=!TEXT:~3,5! 
ECHO !SUBSTRING! 
+18

नोट यह केवल 'setlocal ENABLEDELAYEDEXPANSION' कमांड – Fr0sT

+0

कमांड के बाद काम करेगा या यदि आप कमांड लाइन को/V के साथ कॉल करते हैं, यानी 'cmd/v' – Omertron

11

जोय के उत्तर को अतिरिक्त जानकारी के रूप में, जिसे set /? और न ही for /? की सहायता से वर्णित नहीं किया गया है।

%~0 अपने बैच के नाम पर फैला हुआ है, जैसा कि इसे टाइप किया गया था।
इसलिए यदि आप अपने बैच शुरू के रूप में

%~0 - mYbAtCh 
%~n0 - mybatch 
%~nx0 - mybatch.bat 

विस्तार किया जाएगा लेकिन वहाँ एक अपवाद है, एक सबरूटीन में विस्तार विफल हो सकता है

echo main- %~0 
call :myFunction 
exit /b 

:myFunction 
echo func - %~0 
echo func - %~n0 
exit /b 

यह

main - myBatch 
Func - :myFunction 
func - mybatch 

लिए परिणाम फ़ंक्शन में %~0 बैच फ़ाइल के नहीं, फ़ंक्शन के नाम पर हमेशा विस्तारित होता है।
लेकिन यदि आप कम से कम एक संशोधक का उपयोग करते हैं तो यह फिर से फ़ाइल नाम दिखाएगा!

संबंधित मुद्दे

 संबंधित मुद्दे