2

Я пытаюсь найти строку в заданном файле. Этот файл может содержать пробелы в названии, и у меня возникли проблемы с командным файлом.

Я могу легко сделать это с помощью консоли, получая правильные результаты:

findstr /m /C:tofind "C:/myPath/my file name with white spaces"

Но когда я пытаюсь сделать это в пакетном файле, он не дает мне никакого результата:

@echo off
for /r  "delims:|" %%i in (*) do  (
    findstr /m /C:tofind "%%i"
)

Что я делаю неправильно?

2 ответа2

3

Все, что вам нужно, это следующее:

findstr /m /c:toFind *

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

Если вы хотите найти папку, отличную от текущей, то:

pushd "c:\yourPath"
findstr /m /c:toFind *
popd

Если вы хотите включить полный путь каждого файла в вывод, то:

findstr /m /c:toFind "c:\yourPath\*"

Правильный способ использовать цикл FOR для итерации файлов, как вы изначально предполагали:

for %%F in (*) do findstr /m /c:toFind "%%F"

Но нет необходимости использовать FOR для итерации файлов, когда FINDSTR может итерировать файлы самостоятельно.

Команда FOR является самой сложной командой, доступной для пакетной обработки. Есть много разных форм, которые делают совершенно разные вещи. Здесь только несколько:

for %%A in (file list with wildcard support)     -  iterate files
for /f "options" %%A in (filePath)               -  read and parse a file
for /f "options" %%A in ("string")               -  parse a string
for /f "options" %%A in ('someCommand')          -  parse the output of a command

Вы должны внимательно прочитать документацию. Введите HELP FOR или FOR /? из командной строки, чтобы получить документацию.

1

Я нашел решение.

Кажется, что он работает с двойными кавычками в предложении in и с /F вместо /R/ for the for`:

@echo off
for /f  %%i in ("*") do  (
    findstr /m /C:toFind "%%i"
)

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