Di Windows, file kumpulan dengan rekursif untuk loop dan nama file termasuk kosong

9

Saya memiliki pohon folder, seperti ini (ini hanya sebuah contoh, ini akan lebih dalam pada kasus saya yang sebenarnya):

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

File saya memiliki satu atau lebih spasi dalam nama dan saya perlu melakukan perintah pada mereka, jadi saya tertarik pada foo bar.txt tetapi tidak di foobar.txt.

Saya mencoba (di dalam file batch):

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

di mana perintahnya sederhana echo.
Tidak berfungsi karena ruang dilewati dan saya tidak mendapatkan output.

Ini berfungsi tetapi bukan itu yang saya butuhkan:

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

Mencetak:

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

Saya mencoba menggunakan tanda kutip (") tetapi tidak berhasil:

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

Tidak berfungsi karena tanda kutip masih termasuk dalam output:

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

Jawaban:

9

Bagaimana dengan ini?

for /f "tokens=* delims=" %%a in ('dir "c:\test\foo bar.txt" /s /b') do (
echo %%a
)
Craig H
sumber
ide bagus untuk memindahkan rekursi ke dir! Terima kasih.
Alessandro Jacopson
2

Tanpa sakelar rekursif, Anda dapat meminta FORuntuk tidak mencetak tanda kutip:

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

Anda mungkin dapat melakukan FORpernyataan bersarang . Bagian luar akan berjalan di pohon direktori dan bagian dalam akan menjadi yang di atas.

Dijeda sampai pemberitahuan lebih lanjut.
sumber
Halo, terima kasih atas jawaban Anda. Saya mengedit pertanyaan, pohonnya bisa lebih dalam dari hanya satu tingkat dan karenanya saya perlu rekursif untuk.
Alessandro Jacopson
2
@uvts_cvs: FOR /R %%d in (.) DO for %%f ...bersifat rekursif, tetapi akan ada beberapa hal yang bisa dilakukan untuk membuatnya berfungsi. Anda mungkin harus menggunakan ekspansi yang tertunda, misalnya. SETLOCAL ENABLEDELAYEDEXPANSIONdan !varname!, dll.
Dijeda hingga pemberitahuan lebih lanjut.
% ~ dpnf akan menghilangkan ekstensi file.
dolmen
@dolmen: Memperbaiki kesalahan ketik.
Dijeda sampai pemberitahuan lebih lanjut.
2

Anda mungkin ingin melihat perintah forfiles.

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

'/ S' - Rekursi. Cari semua sub direktori

'/ M "* *"' - Mask file. Hanya mencari file dengan spasi di namanya.

'/ C "cmd / C echo @PATH"' - Command. Terbitkan perintah ini pada semua file yang ditemukan.

Contoh output:

"C:\test\folder1\foo bar.txt"
"C:\test\folder2\foo bar.txt"
"C:\test\folder3\foo bar.txt"
Kesalahan besar
sumber
0

Bendera fadalah salah satu yang Anda butuhkan untuk mendapatkan tanda kutip tanpa nama file absolut (sehingga Anda dapat menempatkan tanda kutip jika Anda perlu). Tetapi karena bertentangan dengan nama variabel yang Anda pilih, Anda harus menggunakan yang lain:

for /r test %%i in ("foo bar.txt") do echo %%~fi
dolmen
sumber
Itu sepenuhnya salah. Tidak ada konflik nama variabel dan kutipan dicetak oleh perintah yang Anda tunjukkan.
Dijeda sampai pemberitahuan lebih lanjut.
0

Terima kasih, Dennis! Saya juga sedang mengerjakan masalah yang hampir identik. Saya ingin file kelelawar yang bisa saya berikan dalam input parm sebagai string pencarian untuk nama file - secara rekursif melalui direktori. Kalau-kalau ini berguna bagi orang lain di sini.

::+++++++++
@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
skippyV
sumber