FINDSTR和跳过文件夹

Ale*_* A. 6 windows batch-file findstr

我是Windows批处理编程和Stack Overflow的新手,所以如果我问你那些经验丰富,才华横溢的人,那么请原谅我.我正在使用Windows批处理(.bat)来查找包含某个字符串的文件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
)
Run Code Online (Sandbox Code Playgroud)

当我查看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
Run Code Online (Sandbox Code Playgroud)

如果它工作正常,只有C:\folder\somefile.rtfC:\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
)
Run Code Online (Sandbox Code Playgroud)

该代码按预期工作; 它会跳过"项目"和"存档"文件夹.我认为问题与我如何打电话有关,findstr但我无法确定我的方式错误.任何见解都将非常感谢!

非常感谢!
-Alex

dbe*_*ham 6

FINDSTR/S选项使其搜索所有文件夹,从而绕过FOR循环的意图.

Stephan使用覆盖而不是追加模式成功诊断了代码中有关重定向的另一个问题.

但是有一种更简单的方法可以获得理想的结果.只需让FINDSTR搜索所有文件夹,并将结果通过管道传输到另一个FINDSTR,以删除包含不需要的文件夹的结果.由于没有循环,您可以安全地使用owverwrite模式进行重定向.

findstr /misl request "%basedir%\*" | findstr /liv "\\projects\\ \\archive\\" >"%basedir%\Projects\list.txt"
Run Code Online (Sandbox Code Playgroud)

编辑

上述简单的解决方案将浪费时间搜索稍后将被排除的文件夹.如果这些文件夹很大,这可能会浪费宝贵的时间.

以下脚本不会打扰扫描"%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\*"
)
Run Code Online (Sandbox Code Playgroud)

如果要跳过名为"Projects"或"Archive"的所有文件夹,无论它们出现在树中的哪个位置,那么:

@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\*"
)
Run Code Online (Sandbox Code Playgroud)


Der*_*rth 5

我有一个类似的问题:我需要使用 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”过滤器的文件才会被搜索。

  • 很好的解决方案,很好的描述。 (2认同)