FINDSTR и пропуск типов файлов

Недавно я опубликовал вопрос о пропуске определенных папок при использовании findstr. (Кстати, это был мой первый вопрос здесь, и на него были получены фантастические ответы! Спасибо, сообщество Stack Overflow!) Теперь я также хотел бы пропустить некоторые типы файлов. То есть я не хочу, чтобы findstr даже пытался искать файлы с расширениями, например, .pdf, .r и .sas. Однако я хочу искать файлы .sas7bdat, поэтому исключения случаев, когда имя файла вообще содержит «.sas», недостаточно. Мой код в его нынешнем виде выглядит следующим образом:

@echo off
setlocal EnableDelayedExpansion
set basedir=N:\folder
set outfile=N:\folder\Projects\list.txt

if exist %outfile% then del %outfile%

findstr /mil frecord "%basedir%\*" > %outfile%

for /f "eol=: delims=" %%g in (
    'dir /a:d-h /b %basedir% ^| findstr /vixl "projects requests temp"'
) do findstr /smil frecord "%basedir%\%%g\*" >> %outfile%

set basedir=
set outfile=

Это захватывает все файлы в %basedir%, которые содержат строку «frecord», и выполняет поиск во всех подпапках %basedir%, кроме Projects, Requests и temp. Результаты записываются в %outfile%.

Каталог %basedir% и его вложенные папки довольно велики, поэтому мне нужно убедиться, что findstr не отнимает лишнего времени на поиск типов файлов, которые не представляют интереса. Однако я не уверен, где ограничение в приведенном выше коде. Цикл FOR перебирает только каталоги в пределах %basedir%, а не конкретные файлы. Требуется ли для этого второй аналогичный цикл FOR? Если да, то куда он пойдет? Или, возможно, есть более простой подход? Я новичок в пакетном программировании Windows, поэтому, пожалуйста, простите меня, если ответ слишком очевиден.

Любые советы или рекомендации будут высоко оценены. Большое спасибо!
-Алекс


person Alex A.    schedule 20.11.2013    source источник


Ответы (1)


Этот ответ был отредактирован, и этот код не проверен:

Удалите показанную здесь строку, если есть много маленьких файлов, так как это замедлит процесс echo checking file "%%a"

@echo off
setlocal
set "basedir=N:\folder"
set "outfile=N:\folder\Projects\list.txt"

if exist "%outfile%" then del "%outfile%"

for /r "%basedir%" %%a in (*) do >>"%outfile%.1" echo %%a
findstr /i /v /l /c:"%basedir%\projects\" /c:"%basedir%\requests\" /c:"%basedir%\temp\" "%outfile%.1" | findstr /i /v /r /c:"\.pdf$" /c:"\.r$" /c:"\.sas$" >"%outfile%.2"
   for /f "delims=" %%a in (' type "%outfile%.2" ') do (
      echo checking file "%%a"
      echo =========== checking "%%a">>"%outfile%"
      findstr "frecord" "%%a">>"%outfile%"
   )
set basedir=
set outfile=
pause
del "%outfile%.?"
person foxidrive    schedule 21.11.2013
comment
Я бы предложил, чтобы первый FOR был на DIR /b /ad (без /s) с findstr /b /e..., а ` removed from the target strings. As it stands, any subdir starting проекты и т. д. были бы исключены, а не только на уровне basedir, но ОП должен уточнить намерение. Затем второй FOR dir должен получить /s и замаскировать "%basedir%\%%a" - person Magoo; 21.11.2013
comment
@Magoo: Чтобы уточнить, подкаталог «Проекты» в %basedir% следует пропустить, но проекты в другой папке, например «Архив», пропускать нельзя. Спасибо, что заметили это! - person Alex A.; 21.11.2013
comment
@magoo Я изменил код, чтобы этого не произошло. Спасибо Магу. - person foxidrive; 22.11.2013