Batch file 日志文件读取和查找值字符串

Batch 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:"^

我有一个日志文件,其中包含以下几行

测试总数: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:"^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.