Следующее создаст файл, содержащий совпадения во всех файлах для всех строк ввода:
@ECHO OFF
>results.txt (
FOR /F "delims=" %%i IN (textlist.txt) DO (
FIND "%%i" files\*.txt | FINDSTR /v "^---- ^$"
)
)
Это работает так:
FIND
принимает входную строку, ищет ее в указанных файлах и печатает результаты, которые передаются в FINDSTR
.
FINDSTR
, устраняет «шум», создаваемый FIND
(пустые строки и строки, такие как ------ filename.txt
) и выводит остальные.
Анализируемый результат выводится на стандартный вывод , который перенаправляется на results.txt
длявесь цикл.
Если, согласно вашему комментарию, вам необходимо дополнительно создать еще один файл, содержащий строки, которые не имеют совпадений, вы можете изменить приведенный выше скрипт следующим образом:
@ECHO OFF
>results.txt <b>2>notinfile.txt</b> (
FOR /F "delims=" %%i IN (textlist.txt) DO (
<b>(</b>FIND "%%i" files\*.txt <b>|| (ECHO %%i) 1>&2)</b> | FINDSTR /v "^---- ^$"
)
)
Логика в основном такая же, за исключением случаев, когда FIND
не получает совпадений для входной строки.В этом случае поисковый термин печатается со стандартной ошибкой (ECHO … 1>&2
).Стандартный вывод FIND
все еще передается по каналу FINDSTR
, и, поскольку он содержит только шум, в этом случае FINDSTR
ничего не дает.
Итак, цикл выдает результатыкак на стандартном выходе, так и на стандартной ошибке, каждый раз в зависимости от результата FIND
.Стандартный вывод перенаправляется на results.txt
, как и в предыдущей версии, а стандартная ошибка перенаправляется на notinfile.txt
.
ОБНОВЛЕНИЕ
Второй сценарий имеетУ вас есть крошечный недостаток, который может или не может быть серьезным в вашей ситуации, в зависимости от того, как вы собираетесь использовать файл notinfile.txt
.Недостаток заключается в добавлении дополнительного пробела в конец каждого значения, которое идет к notinfile.txt
.
Будь то ошибка или какой-либо артефакт, я не знаю, но я выяснил,что если я сохраню результаты FIND
во временном файле и позже загружу их из него в FINDSTR
, дополнительное пространство не будет создано.Я не мог найти какой-либо другой способ исправить проблему с дополнительным пространством, поэтому вот измененная версия:
@ECHO OFF
>results.txt 2>notinfile.txt (
FOR /F "delims=" %%i IN (textlist.txt) DO (
FIND "%%i" files\*.txt <b>>tmpResults</b> || (ECHO %%i) 1>&2
FINDSTR /v "^---- ^$" <b><tmpResults</b>
)
)
DEL tmpResults 2>NUL
ОБНОВЛЕНИЕ 2 (после дополнительных комментариев)
Сзначения в файлах разделены табуляцией, вы можете включить разделитель в строку поиска сразу после искомого термина, чтобы предотвратить сопоставление aaa
с, например, aaa/bbb
.Поэтому вместо
FIND "%%i"
у вас будет
FIND "%%i "
, где широкий пробел после %%i
является символом табуляции.
И я также хотел бы предложитьальтернативная версия команды FINDSTR
.Поскольку вы ищете только один термин, вы можете изменить это:
FINDSTR /v "^---- ^$"
на просто:
FINDSTR "%%i"