डेट स्टैम्प के साथ एक सटीक स्ट्रिंग क्वेरी पर बैच फ़ाइल कमांड चलाएँ


0

मैं एक बैच फ़ाइल बनाना चाहता हूं जो एक कमांड निष्पादित करता है, लेकिन कमांड निष्पादित होने से पहले, यह देखने के लिए लॉग देखना होगा कि क्या इसमें निम्न पंक्ति है:

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

मैं विशिष्ट पाठ की तलाश कर रहा हूं - "DATABASE IS OK"। समस्या यह है कि लॉग में इस लाइन की कई प्रविष्टियाँ होंगी, नवीनतम के साथ फ़ाइल में जोड़ा जाएगा।

मेरा प्रश्न: मैं "DATABASE IS OK" युक्त लॉग फ़ाइल में नवीनतम / अंतिम प्रविष्टि के लिए कैसे देखता हूँ। इसके अलावा, एक तरीका है जिससे हम मिल सकते हैं समय लॉग फ़ाइल को बदल दिया गया / अंतिम अद्यतन किया गया और उस दिनांक और समय प्रविष्टि द्वारा "DATABASE IS OK" लाइन को फ़िल्टर करें, यदि यह लॉग फ़ाइल में मौजूद है।

इसलिए:

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

एक बार नवीनतम डेटास्टैम्प के साथ यह लाइन मिल जाने के बाद, मैं एक कमांड निष्पादित करना चाहता हूं, इससे कोई फर्क नहीं पड़ता कि यह अब क्या है।


तो क्या आपकी स्क्रिप्ट "कमांड" को निष्पादित करने का विकल्प नहीं चुनेगी यदि पिछली बार स्क्रिप्ट की जाँच के बाद से नवीनतम डेटास्टैम्प (पाया गया रेखा) नहीं बदला है?
dtmland

हाँ यह सही है
DextrousDave

जवाबों:


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

आपके उत्तर के लिए धन्यवाद। मैं इसे लागू करने की कोशिश कर रहा हूं - विल यूनिक्सटाइम कमांड विंडोज़ के भीतर काम करेगा ... यह विंडोज कमांडलाइन के लिए है
DextrousDave

@DextrousDave पूरा बैच विंडोज के लिए है। getunixtime फ़ंक्शन सिर्फ गरीब आदमी का है (या यदि आप चाहते हैं तो भोले हैं) यूनिक्स समय का कार्यान्वयन (जो 1 जनवरी 1970 से सेकंड की संख्या है)। फिर भी अपनी आवश्यकताओं के लिए अभी भी पूरी तरह से उपयुक्त है।
Vlastimil Ovčáčík
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.