如果我在日志文件中找到字符串“found”,如何编写批处理脚本来循环目录中的日志文件并生成“filename.found”?

Posted

技术标签:

【中文标题】如果我在日志文件中找到字符串“found”,如何编写批处理脚本来循环目录中的日志文件并生成“filename.found”?【英文标题】:How to write a batch script to loop through logfiles in directory and generate a "filename.found" if i find the string "found" in the log file? 【发布时间】:2020-08-14 09:16:09 【问题描述】:

我有一个目录“D:\logs”,其中包含许多日志文件,例如:HRS.log、SRM.log、KRT.log、PSM.log 等。 每个日志文件中可能有也可能没有字符串“found”。如果日志文件包含字符串“found”,那么我必须生成“fileName.found”,例如:“D:\flags”文件夹中的“SRM.found”文件。 我已经编写了以下脚本,但无法继续进行:

@echo off
setlocal ENABLEDELAYEDEXPANSION

for  %%f IN ("D:\logs\*.log") do (
    findstr /i "found" "%%f" >NUL
    if  "!ERRORLEVEL!"=="0" (
    echo.>"D:\flags\%%f.found"
    ) 
    )
    pause 
    exit /b
)

【问题讨论】:

我认为您需要延迟扩展错误级别测试。 你是对的。感谢您的修复。我已经在问题中编辑了代码 sn-p。但我还是不明白如何生成“filename.found”文件 %%f完全限定 路径,因此 "D:\flags\%%f.found" 不是有效路径。使用"D:\flags\%%~nf.found" 甚至"D:\flags\%%~nxf.found" 是的!那就是缺少的东西!谢谢@JosefZ 【参考方案1】:
@echo off

for /f "delims=" %%A in (
    '2^>nul findstr /i /m "found" D:\logs\*.log'
) do echo( > "D:\flags\%%~nA.found"

findstr /i 可以在文件中搜索不区分大小写的字符串found 并使用参数/m,它只允许返回包含该字符串的文件路径。这可以提高效率,因为for /f 命令只返回感兴趣的文件路径。

%%~nA 使用 for 变量修饰符 n 这是没有扩展名的文件名。查看for /? 了解有关可用修饰符的更多信息。

【讨论】:

虽然问题没有指定生成的.found 文件中是否应该有任何内容,但我可能会建议从中删除空格字符。 我经常发现CD.对此很有用,即) do cd.> "D:\flags\%%~nA.found"【参考方案2】:

好的,这是我为上述问题找到的解决方案:

@echo off
setlocal enabledelayedexpansion

for  %%f IN ("D:\logs\*.log") do (
    find "found" "%%f" >NUL
    if  "!ERRORLEVEL!"=="0" (
        echo.>"D:\flags\%%~nf.found"
    ) 
)
pause
exit /b
)

【讨论】:

我在您的代码中添加了缩进,以清楚地突出显示它有不平衡的括号。我还将要求您查看在您之前提供的答案,这几乎肯定会更有效。 感谢@Compo,是的,之前的答案更有效

以上是关于如果我在日志文件中找到字符串“found”,如何编写批处理脚本来循环目录中的日志文件并生成“filename.found”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中限制日志大小

删除日志文件中的 ^L 字符 [重复]

在哪里可以找到 MySQL 事务日志?

我只需要在多个日志文件中找到匹配模式行的下一行。我在这个网站上找到了下面的 awk 命令

android调试时遇到source not found 如何解决,求解决~!

未找到 Laravel 6 css 和 js 文件( net::ERR_ABORTED 404 (Not Found) )