विंडोज में, लूप के लिए एक पुनरावर्ती के साथ एक बैच फ़ाइल और रिक्त स्थान सहित एक फ़ाइल नाम है


9

मेरे पास एक फ़ोल्डर ट्री है, इस तरह (यह केवल एक उदाहरण है, यह मेरे वास्तविक मामले में गहरा होगा):

C:\test
|   
+---folder1
|       foo bar.txt
|       foobar.txt
|       
+---folder2
|       foo bar.txt
|       foobar.txt
|       
\---folder3
        foo bar.txt
        foobar.txt

मेरी फ़ाइलों के नाम में एक या अधिक स्थान हैं और मुझे उन पर एक कमांड करने की आवश्यकता है, इसलिए मुझे foo bar.txt में दिलचस्पी है लेकिन foobar.txt में नहीं।

मैंने कोशिश की (एक बैच फ़ाइल के अंदर):

for /r test %%f in (foo bar.txt) do if exist %%f echo %%f

जहां कमांड सरल है echo
यह काम नहीं करता क्योंकि अंतरिक्ष छोड़ दिया जाता है और मुझे कोई आउटपुट नहीं मिलता है।

यह काम करता है लेकिन यह वह नहीं है जो मुझे चाहिए:

for /r test %%f in (foobar.txt) do if exist %%f echo %%f

यह प्रिंट करता है:

C:\test\folder1\foobar.txt
C:\test\folder2\foobar.txt
C:\test\folder3\foobar.txt

मैंने उद्धरण चिह्न (") का उपयोग करने की कोशिश की, लेकिन यह काम नहीं करता है:

for /r test %%f in ("foo bar.txt") do if exist %%f echo %%f

यह काम नहीं करता क्योंकि उद्धरण चिह्न अभी भी आउटपुट में शामिल है:

C:\test\folder1\"foo bar.txt"
C:\test\folder2\"foo bar.txt"
C:\test\folder3\"foo bar.txt"

जवाबों:



2

पुनरावर्ती स्विच के बिना, आप FORउद्धरण नहीं छापने के लिए कह सकते हैं :

for %%f in ("foo bar.txt") do @if exist %%f echo %~dpnxf

आप नेस्टेड FORस्टेटमेंट करने में सक्षम हो सकते हैं । बाहरी डायरेक्टरी ट्री को चलाएगा और भीतर वाला ऊपर होगा।


नमस्कार, आपके उत्तर के लिए धन्यवाद। मैंने प्रश्न को संपादित किया, पेड़ केवल एक स्तर से अधिक गहरा हो सकता है और इसलिए मुझे इसके लिए पुनरावर्ती की आवश्यकता है।
एलेसेंड्रो जैकप्सन

2
@uvts_cvs: FOR /R %%d in (.) DO for %%f ...पुनरावर्ती है, लेकिन इसे काम करने के लिए कुछ चीजें करनी होंगी। उदाहरण के लिए, आपको विलंबित विस्तार का उपयोग करना पड़ सकता है। SETLOCAL ENABLEDELAYEDEXPANSIONऔर !varname!, आदि
आगे की सूचना तक रोक दिया गया।

% ~ dpnf फ़ाइल एक्सटेंशन को छोड़ देगा।
dolmen

@ डोलमेन: टाइपो फिक्स्ड।
अगली सूचना तक रोक दिया गया।

2

आप फ़ॉर्फ़ाइल कमांड को देखना चाहते हैं।

forfiles /S /M "* *" /C "cmd /C echo @PATH"

'/ एस' - पुनरावृत्ति। सभी उप निर्देशिकाओं को खोजें

'/ M "* *" - फाइल मास्क। केवल उनके नाम की जगह वाली फाइलों को खोजें।

'/ C "cmd / C echo @PATH" - कमांड। इस आदेश को सभी फाइलों पर जारी करें।

उदाहरण आउटपुट:

"C:\test\folder1\foo bar.txt"
"C:\test\folder2\foo bar.txt"
"C:\test\folder3\foo bar.txt"

0

ध्वज fवह है जिसे आपको एक पूर्ण फ़ाइल नाम witout उद्धरण प्राप्त करने की आवश्यकता है (ताकि यदि आपको ज़रूरत हो तो आप उद्धरण डाल सकते हैं)। लेकिन जैसा कि यह आपके द्वारा चुने गए चर नाम के साथ संघर्ष करता है, आपको एक और का उपयोग करना होगा:

for /r test %%i in ("foo bar.txt") do echo %%~fi

यह पूरी तरह से गलत है। आपके द्वारा दिखाए गए आदेश द्वारा कोई चर नाम संघर्ष और उद्धरण मुद्रित नहीं हैं।
अगली सूचना तक रोक दिया गया।

0

धन्यवाद, डेनिस! मैं भी लगभग एक जैसी समस्या पर काम कर रहा था। मुझे एक बैट फाइल चाहिए थी जिसे मैं एक इनपुट पार्म में फाइलनाम के लिए खोज स्ट्रिंग के रूप में पारित कर सकता हूं - निर्देशिकाओं के माध्यम से पुनरावर्ती। बस के मामले में यह किसी और के लिए उपयोगी है यहाँ है।

::+++++++++
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /R %%d in (.) do (
   for /f "usebackq" %%i in (`dir /b %%d ^| findstr /i %1`) do (
      echo Processing %%i
   )
)
endlocal
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.