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


192

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

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

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

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

जवाबों:


395

ठीक है, अपने बैच के फ़ाइलनाम को प्राप्त करने के लिए सबसे आसान तरीका सिर्फ उपयोग करना होगा %~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%

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

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

help setउस सिंटैक्स पर विवरण के लिए देखें ।


31
एट्रिब्यूशन निष्कर्षण लूप वेरिएबल्स के साथ काम नहीं करता है, इसलिए आपको निम्नानुसार करना होगा (कोड माध्य रेखा विराम में \ r \ n क्योंकि एसओ टिप्पणी में लाइन ब्रेक की अनुमति नहीं देता है):setlocal ENABLEDELAYEDEXPANSION \r\n for /f %%s in ('set') do ( \r\n set tmp=%%s \r\n echo !tmp:~-3! \r\n )
Fr0sT

@ Fr0sT आपको FORछोरों के लिए ऐसा क्यों करना है?
बॉब

4
@ एड्रियन क्यों नहीं? FORबैच फ़ाइलों में एक आधारशिला निर्माण विभिन्न कार्यों की बहुत बड़ी संख्या में प्रदर्शन कर रहा है। Btw, एक उपfor /f %%s in ('set') do call :DoSmth "%%s" \r\n ... \r\n :DoSmth \r\n set var=%1 \r\n echo %var:~1,3%
मार्ग

1
विंडोज़ सर्वर 12 R2 का उपयोग करते हुए,% दिनांक% 21/05/18 (आईटी संस्कृति) जैसा दिखता है; दाहिना तार है: %date:~0,2%%date:~3,2%%date:~6,4%%time:~0,2%%time:~3,2%%time:~6,2%
Phate01

@ Phate01, %date%एक निश्चित प्रारूप में दिनांक बनाने के लिए उपयोग न करें । प्रारूप उपयोगकर्ता की संस्कृति के लिए विशिष्ट है और बदल सकता है। एक उपयोगी प्रारूप में दिनांक और समय प्राप्त करने के बजाय WMI का उपयोग करें जो उपयोगकर्ता की सेटिंग पर निर्भर नहीं करता है। इसके अलावा, मुझे यकीन नहीं है कि यह टिप्पणी यहां क्या कर रही है, क्योंकि यह सवाल तारीख या समय के बारे में नहीं था।
जॉय

38

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

उन सभी के लिए जो मेरे जैसे पीड़ित हो सकते हैं यह काम करने के लिए एक स्थानीय विंडोज में (मेरा स्लोवाक में XP है), आप %एक के साथ बदलने की कोशिश कर सकते हैं!

इसलिए:

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

27
ध्यान दें कि यह केवल setlocal ENABLEDELAYEDEXPANSIONकमांड के बाद काम करेगा
Fr0sT

13

जोई का जवाब है, जो की मदद में वर्णित नहीं है के लिए एक अतिरिक्त जानकारी के रूप में 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हमेशा फ़ंक्शन के नाम तक फैलता है, बैच फ़ाइल का नहीं।
लेकिन अगर आप कम से कम एक संशोधक का उपयोग करते हैं तो यह फिर से फाइलनाम दिखाएगा!

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