批量编程。首次找到另一个字符串的最后一次出现后查找字符串

时间:2012-11-01 10:13:29

标签: dos batch-processing batch-file

我在编写脚本时会遇到一些麻烦,该脚本会找到一个字符串 iff 字符串出现在比以前找到的字符串更高的行号上。

FIND /N "BEGIN" "TEST_LOG.txt" && FIND "[ERROR" TEST_LOG.txt && EXIT /B 255

如果已写入日志(“BEGIN”将始终显示)且第二个字符串“[ERROR”已找到,则此字符串将首先返回退出代码255。

因为希望附加到日志文件,我只想在行号上找到“[ERROR”>>在FIND / N“BEGIN”语句中发现的最大行号。

例如,使用如下日志文件:

BEGINNING 12:03:45.17
BEGINNING 12:03:45.17
BEGINNING 12:03:45.17
BEGINNING 12:03:45.17
[ERROR

我希望代码以错误代码255退出。 但是,使用这样的日志文件我不会:

BEGINNING 12:03:45.17
BEGINNING 12:03:45.17
[ERROR
BEGINNING 12:03:45.17
BEGINNING 12:03:45.17
ALL IS WELL!

我期待您的回复,并在您的帮助之前感谢您。

1 个答案:

答案 0 :(得分:2)

您只需要确定每个字符串出现的最高行号,如果[ERROR字符串行号大于BEGIN,则退出。使用FOR / F循环处理FINDSTR / N中的每个匹配行,并将变量设置为行号。处理的最后一个匹配获胜,并且将是最高匹配。您需要两个循环 - 每个搜索字符串一个。

我使用FINDSTR / B选项只匹配字符串出现在行的开头。如果不是您的要求,显然您可以删除该选项。

@echo off
setlocal
set begin=0
set error=0
for /f "delims=:" %%N in ('findstr /nlb BEGIN TEST_LOG.txt') do set /a begin=%%N
for /f "delims=:" %%N in ('findstr /nlb [ERROR TEST_LOG.txt') do set /a error=%%N
if %error% gtr %begin% exit /b 255