Batch file 日志文件读取和查找值字符串
我有一个日志文件,其中包含以下几行 测试总数:1。通过:0。失败:1。跳过:0Batch file 日志文件读取和查找值字符串,batch-file,Batch File,我有一个日志文件,其中包含以下几行 测试总数:1。通过:0。失败:1。跳过:0 测试执行时间:3.5167分钟 测试总数:1。通过:0。失败:1。跳过:0 当存在类似“失败”的值时:1将以日志文件作为附件启动电子邮件。如果失败:0。不执行任何操作 @外交部我加了这样的代码,应该是这样吗? @Echo off Set "log_file=Automation_Log_20191125_1853_06.log" Call :Main GoTo :EOF :Main findstr /R /C:"^
测试执行时间:3.5167分钟
测试总数:1。通过:0。失败:1。跳过:0 当存在类似“失败”的值时:1将以日志文件作为附件启动电子邮件。如果失败:0。不执行任何操作 @外交部我加了这样的代码,应该是这样吗?
@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分析搜索字符串并确定其本身是否使用文本或正则表达式搜索
在包含空格字符的双引号中指定的搜索字符串被解释为正则表达式字符串,并将空格解释为或表达式
在窗口中执行findstr/?
,输出描述正则表达式字符及其含义的命令FINSTR的帮助
默认情况下,使用/C:“Failed:0”
将导致文本搜索(/L
在未显式指定时隐式使用),并将空格字符解释为文本空格,而非解释为或表达式。这是“搜索字符串”
和/C:“搜索字符串”
之间最重要的区别。/C:“搜索字符串”
中的空格始终被解释为文字字符,即使在另外使用/R
运行正则表达式搜索时,搜索字符串在/C:
后面加上双引号。参数“搜索字符串”
中不带/C:
的空格仅在使用附加选项/L
时解释为空格。在使用带有/R
或不带/L
的“搜索字符串”
时,空格被解释为或表达式
结论:
findstr "word1 word2 word3"
findstr /R "word1 word2 word3"
FINDSTR正在使用正则表达式搜索包含word1
或word2
或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
或
或word 3
的行,其中空格被解释为空格
如果“搜索字符串”
或/C:“搜索字符串”
被解释为文字搜索字符串或正则表达式搜索字符串,建议始终使用/L
或/R
使FINDSTR和命令行的读者100%清楚
因此,此命令行将搜索包含不区分大小写的字符串的行,该字符串可能是失败:
或字符串0
。这里绝对不需要这种搜索,因为它总是会找到与编号无关的失败:
行
退出时返回给调用进程的FINDSTR的值在至少一行上为0
,该行与搜索条件匹配(搜索成功),或者在未找到与搜索条件匹配的行上为1
(搜索失败)。FINDSTR的退出代码由调用FINDSTR.exe的cmd.exe
分配给ERRORLEVEL
因此,以下代码可用于搜索区分大小写的以总测试开始的行:
并包含失败:
,下一个字符是大于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
会覆盖该字符串,因此搜索字符串被解释为正则表达式字符串,但是将空格解释为空格字符,而不是像省略/C:
那样解释为或表达式^
表示行首,*
表示任何字符0次或多次,[123456789]
表示方括号内的一个字符
正匹配时,FINDSTR输出的行通过重定向到设备NUL来抑制,因为这些行实际上并不需要
只有当FINDSTR以小于1的值退出时才有意义,这意味着值为0,因为这意味着日志文件包含报告至少一个失败操作的行
另请参阅运行if/?
时的帮助输出,并阅读:
- 关于Microsoft的文章
使用find
而不是findstr
(语法相同)findstr“ab”
查找包含a
和/或b
的每一行。(或者对整个文本字符串使用findstr/ilc:“失败: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.