看起来只有日志文件包含字符串Failed: X 且X 是大于0 的数字才重要。因此,根本不需要 FOR 循环。在整个文件中搜索这样的字符串就足够了,也许在正确的上下文中,例如在行的开头必须有 Total tests: 以避免误报,并且只需评估下一个字符串是否在日志文件中找到。
在有问题的代码中运行以下命令行会发生什么?
findstr /i "Failed: 0." Automation_Log_20191125_1853_06.log
只指定选项/i 进行不区分大小写的搜索。
既没有使用选项/L 显式请求文字搜索,也没有使用选项/R 显式请求正则表达式搜索。只需将搜索字符串放在双引号中即可指定搜索字符串。在这种情况下,FINDSTR 分析搜索字符串并确定自己是使用文字搜索还是正则表达式搜索。
在双引号中指定的包含空格字符的搜索字符串被解释为正则表达式字符串,并将空格解释为 OR 表达式。
在command prompt 窗口中执行findstr /? 会输出描述正则表达式字符及其含义的命令FINSTR 的帮助。
默认情况下,/C:"Failed: 0" 的使用将导致文字搜索(/L 在未明确指定时隐含使用),将空格字符解释为文字空格,not 解释为 OR 表达式。这是"search string" 和/C:"search string" 之间最重要的区别。 /C:"search string" 中的空格始终被解释为文字字符,即使在额外使用 /R 运行正则表达式搜索时,/C: 之后的搜索字符串也用双引号括起来。没有/C: 的参数"search string" 中的空格仅在使用附加选项/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 的行,其中空格被解释为空间。
如果"search string" 或/C:"search string" 被解释为文字,建议始终使用/L 或/R 使FINDSTR 和命令行读者100% 清楚搜索字符串或作为正则表达式搜索字符串。
因此,此命令行会搜索包含不区分大小写的行:字符串Failed:或 字符串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 /? 的帮助输出并阅读: