Войти

Показать полную графическую версию : [решено] Поиск слова в последней строке


support23
27-06-2012, 10:15
Добрый день!
Есть задача:
В лог файле, в последней строке нужно найти слово, например Error (искать по всей строке), если слово найдено делать действие 1 (завершать процесс), если нет, делать действие 2
лог периодически дописывается новыми строками.
вот что получилось -


SetLocal EnableDelayedExpansion

Set LogDir=C:\Progra~1\test\lab\log
Set LogExt=log
Set NOfLastStrings=1

Set TAlert=false
For /F "tokens=*" %%F In ('Dir "%LogDir%\checkmail.%LogExt%" /B /A-D') Do (
Set LogFile=%LogDir%\%%F
Call :Check
)

If %TAlert%==true (

)
Exit

:Check

Set s=0
For /F %%A In (%LogFile%) Do (Set /A s+=1)


Set /A s-=NOfLastStrings
Set Alert=true
For /F "tokens=* skip=%s%" %%A In (%LogFile%) Do (
Echo %%A|Find "Error">nul&&Set Alert=false
)


If %Alert%==true (
Echo %LogFile% - Warning
Set TAlert=true
echo %date% %time% >> C:\Progra~1\Script\log.txt
echo "Error not found" >> C:\Progra~1\Script\log.txt
) Else (
Echo %LogFile% - OK
taskkill /f /im process.exe
echo %date% %time% >> C:\Progra~1\Script\log.txt
echo "Process Shutdown" >> "C:\Progra~1\Script\log.txt

)

Exit /B


Возникла проблема, если в логе есть пробелы, или в строке используются символы < > (например есть строка "17.08.2011 9:18:03, Получено от: <support@mail.ru>" )
то bat-ник отрабатывает неправильно, как можно исправить ? или какие еще есть варианты решения данного вопроса?
Спасибо!

megaloman
27-06-2012, 22:34
@Echo off
cls

Set LogFile=E:\DDDDD\eee.log
FOR /F "usebackq delims=" %%s IN ("%LogFile%") DO Set Last="%%s"

Set Test=%Last:Error=%

If %Last%==%Test% (
Echo Нет
) Else (
Echo Есть
)

support23
28-06-2012, 10:34
Спасибо! То что нужно!

support23
15-08-2012, 15:17
чтобы не создавать новую тему, напишу здесь:
как проверять наличие слова (например error) не только в последней строке, а в последних N строках ?

(реализация VBS, bat, autoit)

megaloman
15-08-2012, 16:54
@Echo Off
cls

Set LogFile=E:\DDDD\bbb.log
Set N=6

SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

Set NN=0
Set i=0

For /F "usebackq delims=" %%s IN ("%LogFile%") Do (
Set /A NN=!NN!+1
Set Last=" %%s "
Set Test=!Last: Error =!
If Not !Last!==!Test! Set i=!NN!
)

Set Mess=Нет
If %i% GTR 0 (
Set /A i=%NN%-%i%+1
If !i! LEQ %N% Set Mess=Есть
)
Echo %Mess% Пустые строки в подсчетах не участвуют. Я подразумеваю, что слово-это последовательность символов, ограниченных с обеих сторон пробелами, за исключением случая, когда слово расположено в начале или конце строки, или когда оно единственное в строке. В примере анализируем наличие слова Error. Иначе придётся как-то анализировать знаки пунктуации. Если не принимать такое допущение, в этом случае необходимо вместо имеющейся строки написать
Set Test=!Last:Error=!
Но при этом найдём строку как со словом Error, так и со словом ErrorLevel, например.

support23
16-08-2012, 13:04
Благодарю!
Но при этом найдём строку как со словом Error, так и со словом ErrorLevel, например. »
Ничего страшного, этот вариант меня устраивает!




© OSzone.net 2001-2012