我在一个组织中工作,其中每天都有一个应用程序创建日志文件,并且包含增量为7位格式的Batch_Id格式(例如,Batch_Id = 1234567,Batch_Id = 1234568)。我们必须监视当前日志文件中的字符串Batch_Id,如果相同的Batch_Id超过一次然后出现问题并发送邮件,则确定。 我有一个正常工作的波纹管代码
@echo off
echo Working !!!
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('type test.log ^| findstr "Queue_ID"') do (
set $Line=%%a
for /f "tokens=2 delims=^=," %%b in ('echo !$Line!') do (
set $Value=%%b
set $Value=#Queue_id!$Value: =!
if not defined !$Value! (set !$Value!=1) else (set $liste=!$Liste!,[!$Value!])
))
if defined $Liste (
echo Error List : !$Liste!
echo sending Mail...
S:\blat.exe -body !$Liste! -subject "KSD Error" -tf %recipients% -server %smtpserver% -f %sender%)
endlocal
echo Done !!!
Pause
此脚本完成后,如果多次找到相同的Queue_ID则发送邮件。我必须在每个小时运行这个脚本所以我需要,如果在之前的日志扫描中它已经发送了一些Queue_ID的邮件,那么在下一次日志扫描中,它将不会发送前一个Queue_ID的邮件意味着如果多次找到新的Queue_ID然后只发送邮件
我是批处理脚本的新手,我无法实现这一点,但我有一些想法可能会有所帮助!!
在每次日志扫描中,我们都可以在文本文件中写入多个Queue_ID,在下一次扫描期间,我们还搜索文本文件的Queue_ID,如果找到则忽略它们。每日使用当前日期创建的日志文件(例如20140821.LOG)。因此,当第二天第一次运行脚本时,我们必须覆盖此文本文件
答案 0 :(得分:3)
这会产生每日"重复"读取主日志文件时要测试的文件。每次找到重复项时,该行都存储在重复日志中。
@echo off
setlocal enableextensions enabledelayedexpansion
set "logFile=20140804.log"
set "previous=%logFile%.prev"
for %%a in ("%previous%") do for %%b in ("%%~dpa\*.log.prev") do if /i not "%%~nxa"=="%%~nxb" del "%%~fb"
if not exist "%previous%" >"%previous%" echo(@
set "dup="
for /f "tokens=2 delims==," %%b in (
'findstr /l /c:"Queue_ID = " "%logFile%" ^| findstr /v /l /g:"%previous%"'
) do for %%a in (%%b) do if not defined "%%a" ( set ""%%a"=1" ) else if !"%%a"! equ 1 (
set ""%%a"=2"
>>"%previous%" echo(Queue_ID = %%a
set "dup=!dup! [%%a]"
)
)
set "recipients= .... "
set "smtpserver= .... "
set "sender= .... "
if defined dup (
rem "S:\blat.exe" -body "%dup%" -subject "KSD Error" -tf "%recipients%" -server "%smtpserver%" -f "%sender%"
for %%b in (%dup%) do for /f "delims=[]" %%a in ("%%b") do call printLoop.bat %%a
)
在for
命令中,第一个findstr
命令将在日志文件中搜索要处理的行。第二个findstr
过滤此列表:仅检索&#34;之前的&#34; 日志中找不到的那些行(为避免过滤器过程中的错误,以前的代码确保< em>上一个列表不为空。)
然后,for
命令对该行进行标记。等号和逗号用作分隔符。这会将ID留作行中的第二个标记。此ID用作变量名称。对于每个readed行,它测试是否已定义具有此名称的变量。如果没有定义,则这是第一次引用ID,并且变量定义为值1.如果定义了变量,则它是重复的。如果变量的值为1(此值首先重复),则ID将写入上一个日志中,该ID连接到一个列表,该列表稍后将用于发送邮件和变量中的值更改为2,以避免在输入日志中再次找到相同的ID时写入/附加相同的ID。
已修改以适应评论:
添加了不需要的&#34; .prev&#34;文件
更改了代码以删除queue_id号中的空格,以便下一步更容易编码
添加了对批处理文件的调用以处理重复项,并将副本的代码作为参数。