बैच: फ़ाइल एक्सटेंशन निकालें


155

मेरे पास विकिपीडिया से निम्न बैच स्क्रिप्ट है:

@echo off
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%f
)
pause

फॉर-लूप में एक्सटेंशन flv वाली सभी फाइलें एको हो जाती हैं, लेकिन मैं फाइल (एस) के साथ कुछ क्रियाएं करना चाहता हूं, जहां मुझे एक्सटेंशन के बिना एक समय और एक्सटेंशन के साथ एक बार फाइल की आवश्यकता होती है। मैं इन दोनों को कैसे प्राप्त कर सकता हूं?

मैंने समाधान खोजे लेकिन मुझे एक नहीं मिला। मैं बैच में एक असली नौसिखिया हूँ ...

जवाबों:


309

आप %%~nfकेवल संदर्भ के रूप में वर्णित फ़ाइल नाम प्राप्त करने के लिए उपयोग कर सकते हैं for:

@echo off
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%~nf
)
pause

निम्न विकल्प उपलब्ध हैं:

संशोधक विवरण के साथ चर

% ~ I ​​विस्तार का% I जो किसी भी आसपास को हटाता है 
                        उद्धरण चिह्न ("")।
% ~ fI पूरी तरह से योग्य पथ नाम के लिए% I का विस्तार करता है।
% ~ dI% I को केवल एक ड्राइव अक्षर तक विस्तारित करता है।
% ~ pI केवल एक पथ पर% I का विस्तार करता है।
% ~ nI केवल एक फ़ाइल नाम के लिए% I का विस्तार करता है।
% ~ xI केवल फ़ाइल एक्सटेंशन में% I का विस्तार करता है।
% ~ sI केवल छोटे नाम रखने के लिए पथ का विस्तार करता है।
% ~ aI फ़ाइल के फ़ाइल विशेषताओं के% I का विस्तार करता है।
% ~ tI फ़ाइल के दिनांक और समय तक% I का विस्तार होता है।
% ~ zI फ़ाइल के आकार में% I का विस्तार होता है।
% ~ $ PATH: मैं PATH वातावरण में सूचीबद्ध निर्देशिका खोजता हूं 
                        चर और विस्तार% I को पूरी तरह से योग्य नाम के लिए 
                        पहला वाला मिला। यदि पर्यावरण चर नाम है
                        परिभाषित या फ़ाइल खोज से नहीं मिली है,
                        यह संशोधक खाली स्ट्रिंग में फैलता है।    

8
बस एक त्वरित नोट: उपरोक्त उदाहरण में %% f कुछ ऐसा होगा C:\Users\Admin\Ordner\foo.flvऔर %% ~ nf आपको देगा foo। यदि आप एक्सटेंशन को छोड़कर सब कुछ चाहते हैं तो %% ~ df %% ~ pf %% ~ nf जो आपको देगाC:\Users\Admin\Ordner\foo
ehambright

8
@ehambright देर से टिप्पणी, लेकिन मुझे लगता है कि %%~dpnfएक छोटा विकल्प होगा।

संशोधक / विवरण तालिका डिर्क के लिए धन्यवाद। मेरे मामले को %1एक बैच स्क्रिप्ट में परम से एक्सटेंशन के बिना फ़ाइल नाम मिल रहा था । echo %~n1मैं उसके बाद क्या था।
डेव पाइल

26

मामले में आपके वैरिएबल फ़ाइल वास्तव में मौजूद नहीं है FORदृष्टिकोण काम नहीं करेगा। एक चाल जिसका आप उपयोग कर सकते हैं, यदि आप एक्सटेंशन की लंबाई जानते हैं, तो एक विकल्प ले रहा है:

%var:~0,-4%

-4साधन अंतिम 4 अंक (संभवतः कि .ext ) काट दिया जाएगा।


यह मेरे लिए काम नहीं कर रहा है (Win8.1 पर) - शायद echo %f:~0,-4%सवाल में इस्तेमाल किए गए उदाहरण के संदर्भ में प्रयास करने पर मैं इसे गलत समझ रहा हूं । मैं क्या गलत कर रहा हूं?
वुल्फ

2
जाहिर है कि "सामान्य" चर के लिए काम करता है, चर के लिए नहीं (या शायद मुझे सही सिंटैक्स पता नहीं है)। वैसे भी यह ओपी उदाहरण के संदर्भ में काम करेगा: SET fl=%%fऔर फिरecho %fl:~0,-4%
ओहद श्नाइडर

@Wolf आपको लूप वेरिएबल का मान एक सामान्य वैरिएबल पर सेट करने की आवश्यकता है, फिर स्ट्रिंग
वेरिएशन

पर्याप्त से अधिक मामलों में, विस्तार की लंबाई 3 के बराबर नहीं है या अज्ञात नहीं है। आप अभी भी एक के लिए उपयोग कर सकते हैं भले ही फ़ाइल मौजूद नहीं है, मेरा उत्तर देखें।
marsze

14

मैं भी cmd के लिए एक अजनबी हूँ, लेकिन यह कोशिश:

echo %%~nf

8

यह वास्तव में देर से प्रतिक्रिया है, लेकिन मैं इसके साथ आया था एक विशेष समस्या को हल करने के लिए जो मुझे डिस्कइंटरनलस लिनक्सराइज़र के साथ '.efs_ntfs' को उन फाइलों में जोड़ रहा था जो इसे गैर-एनटीएफएस (एफएटी 32) निर्देशिकाओं में सहेजते थे:

@echo off
REM %1 is the directory to recurse through and %2 is the file extension to remove
for /R "%1" %%f in (*.%2) do (
    REM Path (sans drive) is given by %%~pf ; drive is given by %%~df
    REM file name (sans ext) is given by %%~nf ; to 'rename' files, move them
    copy "%%~df%%~pf%%~nf.%2" "%%~df%%~pf%%~nf"
    echo "%%~df%%~pf%%~nf.%2" copied to "%%~df%%~pf%%~nf"
echo.
)
pause

मुझे यकीन नहीं है कि यह पूछे गए सवाल का जवाब देता है, लेकिन यह वास्तव में मेरी मदद करता है, धन्यवाद!
Matan7890

1
@ matan7890 सच; सेशन यह निर्दिष्ट नहीं करता है कि "मैं फ़ाइल (ओं) के साथ कुछ क्रियाएं करना चाहता हूं" [sic] की आवश्यकता होती है, लेकिन उन कार्यों में से एक उन्हें नाम बदल सकता है, जिस स्थिति में मेरा उत्तर स्वीकृत उत्तर का विस्तार है।
एजी हैमरथिफ़

इससे मेरे एक दोस्त को मदद मिली, जिसने .encryptedफिरौती की मांग के साथ, अपनी सभी फाइलें जोड़ लीं और अपनी सभी फाइलें जोड़ लीं। जाहिरा तौर पर हमला करने वाली स्क्रिप्ट एक बैच फ़ाइल रही होगी जो इस का उल्टा है और .encryptedसभी फाइलों में जोड़ा गया है।
AwokeKnowing

1
upvoted क्योंकि आप ड्राइव, पथ, और विस्तार ( %% ~ df %% ~ pf %% ~ nf ) का उल्लेख करते हैं, जो सबसे अधिक बारीकी से केवल विस्तार के बिना फ़ाइल नाम के बजाय मूल प्रश्न से %% f के आउटपुट जैसा दिखता है ( %%) ~ nf )
ehambright

5

मैं इसका उपयोग कर रहा हूं अगर मैं बस एक चर से विस्तार को छीनना चाहता हूं (किसी भी निर्देशिका या मौजूदा फ़ाइलों को लूप किए बिना):

for %%f in ("%filename%") do set filename=%%~nf

यदि आप पूर्ण पथ से एक्सटेंशन स्ट्रिप करना चाहते हैं, तो %%dpnfइसके बजाय उपयोग करें :

for %%f in ("%path%") do set path=%%~dpnf

उदाहरण:

(कंसोल में सीधे उपयोग करें)

@for %f in ("file name.dat") do @echo %~nf
@for %f in ("C:\Dir\file.dat") do @echo %~dpnf

OUTPUT:

file name
C:\Dir\file

0

कॉपिंग करने के लिए साइबरविन बैश का इस्तेमाल करना

  :: e.g. FILE=basename.mp4 => FILE_NO_EXT=basename
  set FILE=%1
  for /f "delims=" %%a in ('bash -c "FILE=%FILE%; echo ${FILE/.*/}" ') do set FILE_NO_EXT=%%a

0

यदि आपका चर एक तर्क है, तो आप बस %~dpnतर्क संख्या के बाद का उपयोग कर सकते हैं , इसलिए आपको विस्तार की लंबाई के लिए चिंता करने की आवश्यकता नहीं है।

उदाहरण के लिए %~dpn0, अपने विस्तार के बिना बैच फ़ाइल का पथ वापस आ %~dpn1जाएगा %1, विस्तार के बिना होगा , आदि।

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