windows - Gennemsnitlig tidsstempel i batchfil

Indlæg af Hanne Mølgaard Plasc

Problem



så kort sagt udsender mit script en csv med lognavnet, tidsstempelet (10:38:52) og meddelelsen (Bekræftelse: SUCCESS og SendResponse: Response message).


Jeg har nu brug for, at dette script skal kunne beregne og udføre tidsforskellen mellem tidsstempel på den første meddelelse og tidsstempel på den anden besked og give et gennemsnit nederst på 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


logfilen indeholder mange poster, men dette script skal og trækker bare de følgende linjer ud


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

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


Disse søgestrenge er defineret af filen searchstrings.txt


Tak for enhver hjælp på dette!

Bedste reference


Koden for PA viser ideen, men da det er satser er der ingen simpel løsning :-)


GetTime-funktionen mislykkes i 14\% af tidsstemplerne for en dag.

Hvorfor? Fordi batch håndterer alle tal med førende nuller som octaler, så en 08 og en 09 ikke konverteres til 8 eller 9, svigter det simpelthen.


Der findes en løsning med præfiks a 1 og bruger kun resten.

set /a "hh=1!var:0,2! \%\% 100"

08 -> 108 mod 100 -> 8


Så det komplette parti kunne se ud


@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!

Andre referencer 1


du er nødt til at analysere tidsstempel og beregne tidsværdien i, sige sekunder.


Denne kode, forudsat dette format 20110314T103852 for den overførte streng i \%1, returnerer tidsværdien i \%2


EDIT: Jeg opdagede, at du ikke kan overføre strengen direkte, så jeg har ændret koden


: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


Du kan derefter bruge den til at beregne tidsforskellen som denne


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


For en mere detaljeret beskrivelse af de kommandoer, der bruges her, skal du kontrollere oplysningerne HELP SET og HELP CALL.