PDA

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


hunk3r
24-05-2015, 14:12
Доброго времени суток.
Есть скрипт проверки событий по заданным аргументам:

@echo off
setlocal enabledelayedexpansion
set r=%1
set u=%2
set p=%3
set x=%4
set y=%5
set z=%6

FOR /F "delims=" %%i IN ('%windir%\system32\wevtutil.exe qe /r:%r% /u:%u% /p:%p% %x% /rd:true /f:text /q:"*[%x%[Provider[@Name='%y%'] and (EventID=%z%)]]"^|find /c "%z%"') do set "cnt=%%~i"

echo !errorlevel!
echo %cnt%

Errorlevel всегда возвращается 0.
Как выводить errorlevel именно команды find, чтобы убедиться, что команда сработала верно. И как смоделировать ситуацию, когда он будет 1?

Georgio
24-05-2015, 15:05
Как выводить errorlevel именно команды find, чтобы убедиться, что команда сработала верно. »


Команда find /c "что-то" в конвейере сработает верно всегда, поскольку её результатом всегда является число (ноль и больше). Соответственно, трудно представить ситуацию, когда "errorlevel" будет больше ноля, разве что в случае ошибки в синтаксисе самой команды.

Iska
24-05-2015, 15:23
Как выводить errorlevel именно команды find, чтобы убедиться, что команда сработала верно. »
В приведённом Вами контексте сие будет затруднительно, поскольку Вы как раз разбираете вывод «find.exe» по «for /f».

hunk3r
24-05-2015, 15:25
Благодарю за ответы. Значит, в моем примере смысла выводить errorlevel нет, если я увижу число событий?

hunk3r
24-05-2015, 23:43
В дальнейшем - делать call с уже вписанными параметрами и получать на почту меседж о текущем состоянии по нужным эвентам нужных серверов.

hunk3r
25-05-2015, 10:24
Ребят, а как включить в конструкцию проверку
if %errorlevel% neq 0 goto B
:B echo "уровень ошибки ..."
else goto A
:A find ...

Iska
25-05-2015, 11:34
«%errorlevel%» от чего?
«else goto A» и следом сразу «:A …» не имеет смысла.

hunk3r
25-05-2015, 11:57
errorlevel wevtutil'a... Как альтернативу - вижу два запроса wevtutil.exe с параметрами и вывод errlvl после первого. Эстетика конструкции пострадает, но что делать?)

hunk3r
25-05-2015, 13:04
Сделал. Конечный скрипт вызываемого файла:
@echo off
setlocal enabledelayedexpansion
set r=%1
set u=%2
set p=%3
set x=%4
set y=%5
set z=%6
%windir%\system32\wevtutil.exe qe /r:%r% /u:%u% /p:%p% %x% /rd:true /f:text /q:"*[%x%[Provider[@Name='%y%'] and (EventID=%z%) and TimeCreated[timediff(@SystemTime) <= 86400000]]]">nul

if %errorlevel% neq 0 set result=-%errorlevel%
if %errorlevel% equ 0 set result=0

FOR /F "delims=" %%i IN ('%windir%\system32\wevtutil.exe qe /r:%r% /u:%u% /p:%p% %x% /rd:true /f:text /q:"*[%x%[Provider[@Name='%y%'] and (EventID=%z%) and TimeCreated[timediff(@SystemTime) <= 86400000]]]"^|find /c "%z%"') do set "cnt=%%~i"

echo %cnt%
echo %result%

Основа:
@call %~dp0\1.bat server user password System ProviderName EventID

Iska
25-05-2015, 13:49
if %errorlevel% neq 0 set result=-%errorlevel%
if %errorlevel% equ 0 set result=0
set /a result = -%errorlevel%
А зачем «-»?

hunk3r
25-05-2015, 14:53
Минус начальству нужен.
Интересно, а можно сделать errorlevel=0, если события не найдены и 1, если найдены?

Iska
25-05-2015, 15:09
Интересно, а можно сделать errorlevel=0, если события не найдены и 1, если найдены? »
Наверное. Как Вы определяете что «найдены» и что «не найдены»?

hunk3r
25-05-2015, 15:35
Ребят. Начальство лютует и я понять не могу, что от меня хотят.
Есть 2 файла: 1.bat и 2.bat
В первом записана команда wevtutil.exe в примерном виде:
@echo off
setlocal enabledelayedexpansion
set r=%1
set u=%2
set p=%3
set x=%4
set y=%5
set z=%6

FOR /F "delims=" %%i IN ('%windir%\system32\wevtutil.exe qe /r:%r% /u:%u% /p:%p% %x% /rd:true /f:text /q:"*[%x%[Provider[@Name='%y%'] and (EventID=%z%)]]"^|find /c "%z%"') do set "cnt=%%~i"


2й файл вызывает первый с доп. прописанными аргументами - call 1.bat r u p x y z

Вопрос! Как получить во втором файле в переменную %ERRORLEVEL%:
а) при успешном выполнении wevtutil+find -> КОЛ-ВО СОБЫТИЙ
б) при ошибке выполнения (файла wevtutil.exe нет, событий нет, ошибка в синтаксисе etc.) -> КОД ОШИБКИ

hunk3r
25-05-2015, 18:56
ВСЁ! Готовый скрипт для передачи кол-ва событий системе мониторинга:
1.bat:
@echo off
chcp 1251>nul
setlocal enabledelayedexpansion
set r=%1
set u=%2
set p=%3
set x=%4
set y=%~5
set z=%6

%windir%\system32\wevtutil.exe qe /r:%r% /u:%u% /p:%p% %x% /rd:true /f:text /q:"*[%x%[Provider[@Name='%y%'] and (EventID=%z%) and TimeCreated[timediff(@SystemTime) <= 86400000]]]">nul

if %errorlevel% neq 0 goto a

FOR /F "delims=" %%i IN ('%windir%\system32\wevtutil.exe qe /r:%r% /u:%u% /p:%p% %x% /rd:true /f:text /q:"*[%x%[Provider[@Name='%y%'] and (EventID=%z%) and TimeCreated[timediff(@SystemTime) <= 86400000]]]"^|find /c "%z%"') do set "cnt=%%~i"

set errorlevel=%cnt%
exit /b %errorlevel%

:a
exit /b -%errorlevel%

2.bat:
@call %~dp0\1.bat localhost user password System "Service Control Manager" 7036
echo %errorlevel%




© OSzone.net 2001-2012