Сценарий .bat или .wsh, который может искать файлы.

Я ищу несколько примеров сценария .bat ИЛИ .wsh, который может делать следующее:

  • Рекурсивно читать имена файлов в каталоге с пользовательским расширением (.dll, .exe и т. Д.)
  • Выполните поиск в указанном пользователем каталоге по указанным выше именам файлов.
  • Создайте отчет о результатах в формате txt или xls, например: x.txt был найден в «C: \ temp», «C: \ blah»

TIA.

РЕДАКТИРОВАТЬ:

Упс, я должен уточнить: здесь два каталога и два поиска.

Поиск 1:

  • Найдите в предоставленном пользователем каталоге "Dir 1" все * .dll.

Поиск 2:

  • Найдите в другом заданном пользователем каталоге «Dir 2» имена файлов, сгенерированные в Search 1. Этот поиск также должен быть рекурсивным.

Итак, если поиск 1 находит файлы foo.dll, foo2.dll и foo3.dll в каталоге 1, поиск 2 должен искать в каталоге 2 файлы foo.dll, foo2.dll и foo3.dll и предоставлять отчет (простой список) каждый найденный файл.


person chrome    schedule 05.01.2009    source источник


Ответы (3)


Поместите следующее в файл .bat, скажем FindAll.bat:

@echo OFF

for /f %%F in ('dir %2\%1 /s /b') do (
    <nul (set /p msg=%%~nxF )
    for /f %%G in ('dir %3\%%~nxF /s /b') do (
        if exist %%G (
            @echo found at %%G
        ) 
    )
)

%1 - это маска файла, предоставленная пользователем.

%2 - это каталог, указанный пользователем для первого поиска.

%3 - это каталог, предоставленный пользователем для второго поиска.

Вызов из командной строки для создания отчета:

FindAll *.dll d:\dir1 d:\dir2 > dll_report.txt 2>&1

Уловка <nul (set /p) выводит текст на консоль без новой строки (любезно предоставлено Pax из этого потока: Как закодировать счетчик для ожидающих процессов в пакетном файле ?)

2>&1, добавленный при вызове командного файла, необходим для захвата всего вывода в файл (любезно aphoria из этого потока: Недостаточно используемые функции пакетных файлов Windows)

person Patrick Cuff    schedule 06.01.2009
comment
Это приближает нас; нужно добавить а / с в первую строку. Что нам действительно нужно, так это способ удалить каталог из имени файла в %% f; прямо сейчас он ищет полное имя файла из dir1 в dir2. Кроме того, поиск в dir2 (%% 3) также должен быть рекурсивным. - person chrome; 06.01.2009
comment
Отлично, спасибо, что вернулись и изменили это, а также за то, что показали, как использовать ‹nul и 2› & 1. - person chrome; 07.01.2009

Почему бы не использовать dir?

Поиск dll в текущем каталоге и во всех подкаталогах

dir /S *.dll

Искать dll на всем C

dir /S C:\*.dll

Сохранить отчет

dir /S C:\*.dll > report.txt
person Tom Ritter    schedule 05.01.2009
comment
Ознакомьтесь с моим последующим ответом, который проясняет вопрос. - person chrome; 06.01.2009
comment
Ах, спасибо большое! Мне даже в голову не пришло, что режиссер сделает это! Также вы можете использовать dir /B /S "myPath""*myString*". - person Camilo Martin; 31.03.2012

Я бы изучил Robocopy, чтобы узнать, может ли это помочь (ключ / L является подсказкой).

person GvS    schedule 06.01.2009