Среднее время в пакетном файле - PullRequest
4 голосов
/ 01 апреля 2011

Итак, вкратце, мой скрипт в настоящее время выводит CSV с именем журнала, отметкой времени (10:38:52) и сообщением (Проверка: SUCCESS и SendResponse: Ответное сообщение).

Теперь мне нужно, чтобы этот скрипт мог вычислять и выводить разницу во времени между отметкой времени в первом сообщении и отметкой времени во втором сообщении и предоставлять среднее значение в нижней части 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 ]

2 голосов
/ 01 апреля 2011

Вы должны проанализировать отметку времени и вычислить значение времени, скажем, в секундах.

Этот код, предполагая, что этот формат 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 SET и HELP CALL.

1 голос
/ 01 апреля 2011

Код PA демонстрирует идею, но, поскольку она пакетная, простого решения не существует :-)

Функция getTime не будет работать в течение 14% временных отметок дня.
Почему?Поскольку пакетный режим обрабатывает все числа с ведущими нулями как восьмеричные, поэтому 08 и 09 не преобразуются в 8 или 9, просто происходит сбой.

Существует обходной путь с префиксом a 1 и используется только остаток.
set /a "hh=1!var:0,2! %% 100"
08 -> 108 mod 100 -> 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!
...