Я хочу создать командный файл, который выполняет команду, но перед тем, как команда будет выполнена, он должен посмотреть журнал, чтобы увидеть, содержит ли он следующую строку:

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

Я ищу конкретный текст - "База данных в порядке". Проблема в том, что в журнале будет несколько записей этой строки, причем последние добавляются в файл.

Мой вопрос: Как мне найти последнюю / последнюю запись в файле журнала, содержащем "БАЗА ДАННЫХ ОК". Кроме того, есть ли способ, которым мы можем получить время, когда файл журнала был изменен / последний раз обновлен, и отфильтровать строку "БАЗА ДАННЫХ ОК" по этой дате и времени, если она существует в файле журнала.

Так:

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

Как только эта строка с последней датой будет найдена, я хочу выполнить команду, независимо от того, какая она сейчас.

1 ответ1

1

Отметка времени обновления файла вам не поможет. Вместо этого вам нужно сохранить время вашей последней проверки (т. Е. Запустить пакет). Следующая партия хранит время последней проверки в файле:

@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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .