我最近发布了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
答案 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%.?"