FINDSTR和跳过文件类型

时间:2013-11-20 17:32:00

标签: windows batch-file findstr

我最近发布了question关于在使用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批处理编程的新手,如果答案显而易见,请原谅我。

非常感谢任何建议或指导。非常感谢!
-Alex

1 个答案:

答案 0 :(得分:0)

此答案已编辑,此代码未经测试:

如果有大量小文件,请删除此处显示的行,因为它会减慢流程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%.?"