我有一个日志文件,其中包含以下几行。
测试总数:1。通过:0。失败:1。跳过:0。
测试执行时间:3.5167 分钟
测试总数:1。通过:0。失败:1。跳过:0。
@Echo off
Set "log_file=Automation_Log_20191125_1853_06.log"
Call :Main
GoTo :EOF
:Main
for /f "delims=" %%i in ('findstr /i "Failed: 0." %log_file%') do (
set line=%%i
HERE I NEED HELP
)
Exit /B
当存在类似于 Failed: 1 的值时,将发送一封电子邮件,并将日志文件作为附件。如果失败:0。不执行任何操作。
@Mofi 我添加了这样的代码,应该是这样吗?
@Echo off
Set "log_file=Automation_Log_20191125_1853_06.log"
Call :Main
GoTo :EOF
:Main
findstr /R /C:"^Total tests: .*Failed: [123456789]" %log_file% >nul
if not errorlevel 1
echo Send the log file Automation_Log_20191125_1853_06.log with an email.
Exit /B
看起来只有日志文件包含字符串
Failed: X
且 X
大于 0
的数字才重要。因此,根本不需要 FOR 循环。在整个文件中搜索这样的字符串就足够了,也许在正确的上下文中,例如行开头必须有 Total tests:
以避免误报,然后评估下一步是否在日志文件中找到该字符串。
运行相关代码中的以下命令行会发生什么?
findstr /i "Failed: 0." Automation_Log_20191125_1853_06.log
仅指定选项
/i
进行不区分大小写的搜索。
既没有使用选项
/L
来显式请求文字搜索,也没有使用选项 /R
来显式请求正则表达式搜索。只需将搜索字符串放在双引号中即可指定。在这种情况下,FINDSTR 会分析搜索字符串并确定自己是使用文字搜索还是正则表达式搜索。
用双引号指定的包含空格字符的搜索字符串将被解释为正则表达式字符串,并将空格解释为 OR 表达式。
在
命令提示符窗口中执行
findstr /?
会输出命令FINSTR的帮助,描述正则表达式字符及其含义。
使用
/C:"Failed: 0"
默认情况下会导致文字搜索(/L
在未明确指定的情况下隐式使用),并将空格字符解释为文字空格,将 not 解释为 OR 表达式。这是"search string"
和/C:"search string"
之间最重要的区别。 /C:"search string"
中的空格始终被解释为文字字符,即使另外使用 /R
来运行正则表达式搜索(搜索字符串在 /C:
之后用双引号引起来)。没有 "search string"
的参数 /C:
中的空格仅在使用附加选项 /L
时才被解释为空格。使用 "search string"
与 /R
或不使用 /L
时,空格被解释为 OR表达式。
结论:
findstr "word1 word2 word3"
findstr /R "word1 word2 word3"
FINDSTR 使用正则表达式搜索包含
word1
OR word2
OR word3
的行。
findstr /C:"word 1" /C:"word 2" /C:"word 3"
findstr /L /C:"word 1" /C:"word 2" /C:"word 3"
FINDSTR 正在通过文字搜索来搜索包含
word 1
OR word 2
OR word 3
的行,其中空格被解释为空格。
如果
/L
或 /R
被解释为文字搜索字符串或正则表达式搜索,建议始终使用 "search string"
或 /C:"search string"
以使 FINDSTR和命令行读者 100% 清晰字符串。
因此,此命令行会搜索包含不区分大小写的字符串
Failed:
OR 字符串 0
的行。这里绝对不需要这样的搜索,因为它总是会找到带有 Failed:
的行,与数字无关。
退出时返回到调用进程的FINDSTR的值是
0
(在至少找到与搜索条件匹配的行(搜索成功))或1
(在未找到与搜索条件匹配的行(搜索失败))。 FINDSTR 的退出代码是通过 cmd.exe
调用 findstr.exe
到 ERRORLEVEL
来分配的。
因此,以下代码可用于搜索区分大小写,查找以
Total tests:
开头并包含 Failed:
且下一个字符比 0
更大的行,并评估退出代码是否成功找到一行符合搜索条件。
%SystemRoot%\System32\findstr.exe /R /C:"^Total tests: .*Failed: [123456789]" Automation_Log_20191125_1853_06.log >nul
if not errorlevel 1 echo Send the log file Automation_Log_20191125_1853_06.log with an email.
使用
/C:
指定的搜索字符串默认解释为文字搜索字符串,但 /R
会覆盖它,因此搜索字符串会解释为正则表达式字符串,但空格会解释为空格字符而不是 OR表达式就像省略 /C:
时的情况一样。 ^
表示行首,.*
表示任何字符 0 次或多次,[123456789]
表示方括号内的字符之一。
通过将FINDSTR在肯定匹配上输出的行通过将其重定向到设备NUL来抑制,因为这些行并不是真正需要的。
仅当 FINDSTR 以小于 1 的值退出时才有意义,这意味着值为 0,因为这意味着日志文件包含一行报告至少一个失败的操作。
另请参阅运行
if /?
时的帮助输出并阅读: