У Windows - пакетний файл з рекурсивним циклом та назвою файлу, включаючи пробіли


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.

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

'/ S' - рекурсія. Пошук у всіх підкаталогах

'/ 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- це той, який вам потрібен, щоб отримати абсолютне ім'я файлу з цитатами (тож ви можете ставити лапки, якщо вам потрібно). Але оскільки це суперечить вибраному вами змінній, вам доведеться використовувати інше:

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

Це абсолютно неправильно. Немає конфлікту змінних імен, і лапки друкуються командою, яку ви показуєте.
Призупинено до подальшого повідомлення.

0

Спасибі, Деннісе! Я теж працював над майже однаковою проблемою. Я хотів, щоб файл bat був, який я міг би передати у вхідний парм як рядок пошуку файлів файлів - рекурсивно через каталоги. Про всяк випадок це корисно комусь іншому.

::+++++++++
@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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.