批处理文件在日志文件中找到重复的ID时执行操作,&在下一次运行中,当找到新的重复ID而不是前一个时执行操作

时间:2014-08-24 13:02:14

标签: regex batch-file cmd

我在一个组织中工作,其中每天都有一个应用程序创建日志文件,并且包含增量为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)。因此,当第二天第一次运行脚本时,我们必须覆盖此文本文件

1 个答案:

答案 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号中的空格,以便下一步更容易编码

  • 添加了对批处理文件的调用以处理重复项,并将副本的代码作为参数。