gpt4 book ai didi

windows - FINDSTR 和跳过文件夹

转载 作者:可可西里 更新时间:2023-11-01 13:28:46 24 4
gpt4 key购买 nike

我是 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
)

当我查看从 findstr 输出的文件 list.txt 时,我发现我告诉它不要搜索的文件夹被搜索到了。也就是说,输出如下所示:

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.rtfC:\folder\Requests\anotherfile.rtf 会包含在列表中。文本。为了测试循环代码,我使用了以下代码:

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
)

该代码按预期工作;它会跳过 Projects 和 Archive 文件夹。我认为问题与我调用 findstr 的方式有关,但我无法识别我的方法的错误。任何见解将不胜感激!

非常感谢!
-亚历克斯

最佳答案

FINDSTR/S 选项导致它搜索所有文件夹,从而绕过了 FOR 循环的意图。

Stephan 确实成功地诊断了您的代码的另一个问题,该问题是关于使用覆盖而不是追加模式进行重定向的。

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

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

编辑

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

以下脚本不会扫描“%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\*"
)

如果您想跳过所有名为“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\*"
)

关于windows - FINDSTR 和跳过文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20076262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com