批处理文件中的平均时间戳

时间:2011-04-01 15:08:54

标签: windows batch-file timestamp average

所以简而言之,我的脚本当前输出一个带有日志名称,时间戳(10:38:52)和消息(验证:SUCCESS和SendResponse:响应消息)的csv。

我现在需要这个脚本能够计算并输出第一条消息上的时间戳和第二条消息上的时间戳之间的时差,并提供csv底部的平均值。

@echo off
setlocal EnableDelayedExpansion
echo."Location","Date Time","Result","diff" > output2.csv
( 
  for %%a in (z:\logdir\*.log) do (
    for /f "tokens=1,2,3,4,5,6,7,8,9,10 delims=[+]" %%B in ('findstr /g:searchstrings.txt  ^< %%a') do (
      set var=%%B
      set var1=!var:~-6!
      echo."%%a","!var1!","%%B","%%F","timetaken"
    ) 
  )
) >> output2.csv

日志文件包含许多条目,但是这个脚本应该并且确实只提取以下行

[20110314T103852][EMVLib][5056][I000000]:  Verification: SUCCESS

[20110314T103902][CSV][3232][D000000]: SendResponse: Response message

这些搜索字符串由文件searchstrings.txt

定义

感谢您提供任何帮助!

2 个答案:

答案 0 :(得分:2)

你必须解析时间戳并计算时间值,比如秒。

此代码(假设20110314T103852中传递的字符串格式为%1,返回%2

中的时间值

编辑:我发现你无法直接传递字符串,所以我修改了代码

:gettime
set hh=!%1:~9,2!
set mm=!%1:~11,2!
set ss=!%1:~13,2!
set /A %2=hh*3600+mm*60+ss
goto :eof

然后你可以用它来计算这样的时差

set t=%%a
call :gettime t t1
...
set t=%%a
call :gettime t t2
set /A deltat=t2-t1

有关此处使用的命令的更详细说明,请检查HELP SETHELP CALL信息。

答案 1 :(得分:1)

PA的代码显示了这个想法,但由于它的批处理没有简单的解决方案:-)

getTime函数将在一天的14%的时间戳中失败 为什么?因为批处理所有带有前导零的数字作为八进制,所以08和09不会转换为8或9,它只是失败。

存在一个前缀为1的变通方法,仅使用余数 set /a "hh=1!var:0,2! %% 100"
08 - &gt; 108 mod 100 - &gt; 8

所以完整的批次看起来像

@echo off
setlocal EnableDelayedExpansion
@echo off
setlocal EnableDelayedExpansion
echo."Location","Date Time","Result" > output2.csv
set totalVerifyTime=0
set totalVerifyCount=0
( 
  for %%a in (n.txt) do (
    for /f "tokens=1,5 delims=[+]" %%B in (%%a) do (
      set timefield=%%B
      set timestamp=!timefield:~-6!
      set /a "seconds=1!timestamp:~-2!%%100 + ( 1!timestamp:~0,2!%%100 * 60 + 1!timestamp:~2,2!%%100 ) * 60"
      if "%%C"==":  Verification: SUCCESS" (
        set verifyStart=!seconds!
        echo."%%a","!timestamp!","%%B","%%C", "!seconds!", "start of verify"
      ) ELSE (
        set /a diff=seconds - verifyStart
        echo."%%a","!timestamp!","%%B","%%C", "!seconds!", "!diff!"
        set /a totalVerifyTime+=diff
        set /a totalVerifyCount+=1
      )

    ) 
  )
)
set /a "totalAvg=totalVerifyTime/totalVerifyCount"
echo avg = !totalAvg!