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"

5 ответов5

9

Как насчет этого?

for /f "tokens=* delims=" %%a in ('dir "c:\test\foo bar.txt" /s /b') do (
echo %%a
)
2

Без рекурсивного переключателя вы можете указать FOR не печатать кавычки:

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

Вы могли бы сделать вложенные операторы FOR . Внешний будет идти по дереву каталогов, а внутренний будет выше.

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

Спасибо, Деннис! Я тоже работал над почти идентичной проблемой. Я хотел файл 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
0

Флаг f - это тот, который вам нужен, чтобы получить абсолютное имя файла без кавычек (так что вы можете поместить кавычки, если вам нужно). Но так как он конфликтует с выбранным вами именем переменной, вы должны использовать другое:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .