Используйте Batch findstr для файлов с пробелами

5753
Alvaro

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

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

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
Я полагаю, что файл bash, о котором вы говорите, является опечаткой. Какова цель цикла for? Команда `for / r` не принимает такие параметры, как` for / f`, для которых синтаксис будет `delims =` вместо `delims:`. Marcks Thomas 10 лет назад 0
@MarcksThomas Я просто хочу перебрать элементы папки. Не знаю другого способа сделать это. Alvaro 10 лет назад 0
Я взял это от: http://stackoverflow.com/questions/138497/iterate-all-files-in-a-directory-using-a-for-loop Alvaro 10 лет назад 0
И да, это была опечатка. Я хотел сказать, Batch. Alvaro 10 лет назад 0

2 ответа на вопрос

3
dbenham

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

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 /?из командной строки, чтобы получить документацию.

Спасибо друг!! Ваш второй вариант сработал как шарм! Вывод результатов, готовых к использованию на PHP. Еще один быстрый вопрос. Можно ли как-то вернуть им такой массив? Я получаю их как одну единственную строку, разделенную пробелами. (о вызове PHP в файл .bat) Alvaro 10 лет назад 0
@ Альваро - я не понимаю, о чем ты спрашиваешь. Похоже, это должен быть новый вопрос, возможно, о StackOverflow, с гораздо большим количеством деталей. dbenham 10 лет назад 0
ок, все равно спасибо! Кроме того, это был бы более быстрый способ поиска текста по элементам? Alvaro 10 лет назад 0
@ Alvaro - я никогда не проверял, но я сомневаюсь, что в этом случае есть существенная разница в скорости. dbenham 10 лет назад 0
1
Alvaro

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

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

@echo off for /f %%i in ("*") do ( findstr /m /C:toFind "%%i" ) 
Ваш цикл FOR / F не делает ничего конструктивного - он просто присваивает `*` переменной FOR `%% i`. Следующая строка дает тот же результат, что и выше: `findstr / m / c: toFind *` dbenham 10 лет назад 0
Что вы имеете в виду? Кажется, чтобы решить мою проблему с пробелами. Теперь в `%% i` у меня есть полное имя файла, а не просто часть, как раньше. Alvaro 10 лет назад 0
Я не говорил, что ваш код не работает, я просто говорю, что он излишне сложен, и он не решает проблему так, как вы думаете. Смотрите [мой ответ] (http://superuser.com/a/702048/109090) dbenham 10 лет назад 1