2013-11-19 4 views
4

Я новичок в программном обеспечении Windows и переполнении стека, поэтому, пожалуйста, простите меня, если я попрошу все, что явно очевидно для вас, опытных, талантливых людей. Я использую пакет Windows (.bat) для поиска файлов, содержащих определенную строку, с использованием findstr. Однако я пытаюсь пропустить определенные папки в каталоге.FINDSTR и пропущенные папки

setlocal EnableDelayedExpansion 
set basedir=C:\folder 

for /f %%g in ('dir /a:-h /b %basedir% ^| findstr /v "Projects" ^| findstr /v "Archive"') do (
    findstr /i /m /s /c:"request" %basedir%\%%g *.* > %basedir%\Projects\list.txt 
) 

Когда я смотрю в list.txt, выходной файл из findstr, я считаю, что папки я сказал это не поиск Поиск. То есть, результат выглядит следующим образом:

C:\folder\somefile.rtf 
C:\folder\Requests\anotherfile.rtf 
C:\folder\Projects\dontsearchme.txt 
C:\folder\Archive\dontsearchmeeither.txt 
C:\folder\Archive\Projects\dontsearchme.txt 

Если бы работал правильно, был бы включен только C:\folder\somefile.rtf и C:\folder\Requests\anotherfile.rtf в list.txt. Для проверки кода цикла я использовал следующее:

setlocal EnableDelayedExpansion 
set basedir=C:\folder 

for /f %%g in ('dir /a:-h /b %basedir% ^| findstr /v "Projects" ^| findstr /v "Archive"') do (
    echo %basedir%\%%g 
) 

Этот код работает по желанию; он пропускает папки «Проекты» и «Архив». Я предполагаю, что проблема имеет какое-то отношение к тому, как я звоню findstr, но я не смог определить ошибку своих способов. Любое понимание было бы высоко оценено!

Большое спасибо!
-Alex

+0

Вы пытались взять '/ s' из своего findstr? –

+0

@MattWilliamson: Я редактировал вопрос, чтобы показать, что есть подпапки, которые я _do_ хочу найти. Когда я удаляю '/ s',' findstr' не попадает в нужные папки. –

+0

Хорошо. Я возьму его из «Findstr», но добавлю его в 'DIR' и посмотрим, сделает ли это это. –

ответ

6

Опция FINDSTR/S вызывает поиск по всем папкам, тем самым минуя намерение вашего цикла FOR.

Стефан успешно диагностировал еще одну проблему с вашим кодом в отношении перенаправления с использованием перезаписи вместо режима добавления.

Но есть гораздо более простой способ получить желаемый результат. Просто дайте FINDSTR искать все папки и вывести результат в дополнительный FINDSTR для удаления результатов, содержащих нежелательные папки. Поскольку нет петли, вы можете безопасно использовать режим перезаписи для перенаправления.

findstr /misl request "%basedir%\*" | findstr /liv "\\projects\\ \\archive\\" >"%basedir%\Projects\list.txt" 

EDIT

выше простое решение будет тратить время на поиск папки, которые будут позже получить исключенные. Это может потерять ценное время, если эти папки огромны.

Следующий сценарий не будет проверять папки «% basedir% \ Projects» или «% basedir% \ Archive».

@echo off 
setlocal EnableDelayedExpansion 
set basedir=C:\folder 

>"%basedir%\Projects\list.txt" (
    findstr /mil request "%basedir%\*" 
    for /f "eol=: delims=" %%F in (
    'dir /a:d-h /b %basedir% ^| findstr /vixl "projects archive"' 
) do findstr /smil request "%basedir%\%%F\*" 
) 

Если вы хотите, чтобы пропустить все папки с названием «Проекты» или «Архив», независимо от места их появления в дереве, а затем:

@echo off 
setlocal EnableDelayedExpansion 
set basedir=C:\folder 

>"%basedir%\Projects\list.txt" (
    findstr /mil request "%basedir%\*" 
    for /f "eol=: delims=" %%F in (
    'dir /s /a:d-h /b %basedir% ^| findstr /vir "[\\]projects[\\] [\\]archive[\\] [\\]projects$ [\\]archive$"' 
) do findstr /mil request "%%F\*" 
) 
+1

Мне нравится простота. Однако не найдут ли все файлы, содержащие «запрос», даже в нежелательных папках, а затем фильтруют эти результаты, а не только поиск нужных папок? Это важно, потому что я собираюсь запустить это в огромном каталоге. Спасибо! –

+0

@Alex - Да, это будет время сканирования исключенных папок. См. Мой обновленный ответ для скрипта, который полностью обходит исключенные папки. – dbenham

+0

Когда я запускаю это, он все еще попадает в папки, которые я не хочу искать. –

1

Ваша проблема: с перенаправлением > вы каждый раз переписываете свой список .txt; в последний раз, когда вы перезаписываете его пустой строкой. Используйте вместо этого >> (добавьте в файл). Остальная часть вашего кода работает на меня.

+0

Когда я использую '>>' вместо '>', я ничего не записываю в list.txt. Результат в list.txt работал как ожидалось, используя '>'. –

+0

Вы определили проблему с кодом, но это не имеет ничего общего с заявленным вопросом OP. Остальная часть кода не работает нормально из-за опции FINDSTR/S. – dbenham

0

Ваш код имеет пару очков трудно следовать. Вы хотите пропустить папки, но for /f %%g in ('dir /a:-h /b %basedir% команда получает все не скрытые имена, включая файлы и папки. В конце вы используете > для хранения результатов, так что только результат последнего findstr ... %%g хранится в этом файле.Вы должны использовать >> вместо этого, как указывает Стефан. Тем не менее, я до сих пор не понимаю, как вы получаете этот результат!

Предлагаю вам изменить свой код, чтобы упростить его, поэтому может быть проще следить и обнаруживать возможные ошибки. Например:

setlocal EnableDelayedExpansion 
set basedir=C:\folder 
set omitfolders=\Projects\Archive\ 
cd %basedir% 
for /D %%g in (*) do (
    if "!omitfolders:\%%g\=!" equ "%omitfolders%" (
     findstr /i /m /s /c:"request" %basedir%\%%g\*.* >> %basedir%\Projects\list.txt 
    ) 
) 

Испытание if "!omitfolders:\%%g\=!" equ "%omitfolders%" команда, если имя папки не в omitfolders переменной.

+0

Я хочу искать файлы в '% basedir%', а также файлы в подпапках. Он работает, если я включу 'findstr/imc:" запрос "% basedir% \ *. *>% Basedir% \ Projects \ list.txt' до цикла, который добавляется к файлу. Большое спасибо за помощь! –

2

У меня была аналогичная проблема: мне нужно использовать Findstr искать все .js файлы кроме тех, в папке node_modules (то есть, я хотел найти свой код, но не код любых импортируемых модулей). Это команда, которую я использовал:

dir /S /B *.js | findstr /v /i node_modules | findstr /i /F:/ todo

Ломая, что вниз:

  • dir /S /B *.js выведет полный путь всех файлов .js в текущем каталоге и всех его подкаталогах
  • findstr /v /i node_modules фильтры список путей и удаляет любой путь, содержащий строку «node_modules». (Флаг/v создает выходные строки findstr, которые делают не.)
  • findstr /i /F:/ todo - «/ F: /» сообщает findstr принять список путей к файлам для поиска с консоли.

Таким образом, поиск осуществляется только с файлами, которые проходят через фильтр «node_modules».

+0

Отличное решение, отличное описание. – Seth

Смежные вопросы