Execute o comando do arquivo em lote em uma consulta String exata com um carimbo de data

0

Eu quero criar um arquivo de lote que execute um comando, mas antes que o comando seja executado, ele deve procurar um log para ver se ele contém a seguinte linha:

DOFWADX 2013/07/24 15:42:33 -I- DATABASE IS OK.

Estou procurando o texto específico - "DATABASE IS OK". O problema é que haverá várias entradas dessa linha no log, com as mais recentes sendo anexadas ao arquivo.

Minha pergunta: Como procuro a última / última entrada no arquivo de log contendo "DATABASE IS OK". Além disso, existe uma maneira de obter o tempo em que o arquivo de log foi alterado / atualizado pela última vez e filtrar a linha "DATABASE IS OK" pela entrada de data e hora, se existir no arquivo de log.

Então:

DOFWADX [date and time log file was changed/updated] -I- [look for this line >>]DATABASE IS OK.

Quando essa linha com o datestamp mais recente for encontrada, quero executar um comando, não importa o que é agora.

    
por DextrousDave 24.07.2013 / 20:26

1 resposta

1

O registro de data e hora da atualização do arquivo não ajudará você. Você precisa armazenar a hora da sua última verificação (ou seja, executar o lote). O lote a seguir armazena a última hora de verificação em um arquivo:

@echo off
setlocal enabledelayedexpansion

:: Check parameters.
if "%~1" == "" (
    echo Usage: readlog.bat example.log
    exit /B 1
)

:: Read time of last check from example.log.lastcheck file, or create one.
if exist "%~1.lastcheck" (
    for /F "usebackq tokens=*" %%L in ("%~1.lastcheck") do set lastcheck=%%L
) else (
    set lastcheck=0
)

:: Update example.log.lastcheck file with current time.
call :getunixtime %date:~-4% %date:~-8,2% %date:~-12,2% %time:~,2% %time:~3,2% %time:~6,2%
echo %unixtime% > "%~1.lastcheck"

:: Process log.
for /F "usebackq tokens=2-7 delims=/: " %%A in ('type test.log ^| findstr /c:"DATABASE IS OK"') do (
    call :getunixtime %%A %%B %%C %%D %%E %%F

    :: if an OK entry older than last check exist
    if !unixtime! GTR %lastcheck% (
        echo doing my stuff
        goto :done
    )
)
:done

exit /B 0

:: Poor man's implementation of Unix time.
:getunixtime
set "unixtime=(%1-1970)*365*24*3600 + %2*30*24*3600 + %3*24*3600 + %4*3600 + %5*60 + %6"
:: Remove leading zeros to prevent octal interpretation.
set "unixtime=%unixtime: 0= %"
set /a "unixtime=%unixtime%"
goto :eof
    
por 24.07.2013 / 23:19