Показать полную графическую версию : [решено] Корректное возвращение Errorlevel
Доброго времени суток.
Есть скрипт проверки событий по заданным аргументам:
@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?
Как выводить errorlevel именно команды find, чтобы убедиться, что команда сработала верно. »
Команда find /c "что-то" в конвейере сработает верно всегда, поскольку её результатом всегда является число (ноль и больше). Соответственно, трудно представить ситуацию, когда "errorlevel" будет больше ноля, разве что в случае ошибки в синтаксисе самой команды.
Как выводить errorlevel именно команды find, чтобы убедиться, что команда сработала верно. »
В приведённом Вами контексте сие будет затруднительно, поскольку Вы как раз разбираете вывод «find.exe» по «for /f».
Благодарю за ответы. Значит, в моем примере смысла выводить errorlevel нет, если я увижу число событий?
В дальнейшем - делать call с уже вписанными параметрами и получать на почту меседж о текущем состоянии по нужным эвентам нужных серверов.
Ребят, а как включить в конструкцию проверку
if %errorlevel% neq 0 goto B
:B echo "уровень ошибки ..."
else goto A
:A find ...
«%errorlevel%» от чего?
«else goto A» и следом сразу «:A …» не имеет смысла.
errorlevel wevtutil'a... Как альтернативу - вижу два запроса wevtutil.exe с параметрами и вывод errlvl после первого. Эстетика конструкции пострадает, но что делать?)
Сделал. Конечный скрипт вызываемого файла:
@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
if %errorlevel% neq 0 set result=-%errorlevel%
if %errorlevel% equ 0 set result=0
set /a result = -%errorlevel%
А зачем «-»?
Минус начальству нужен.
Интересно, а можно сделать errorlevel=0, если события не найдены и 1, если найдены?
Интересно, а можно сделать errorlevel=0, если события не найдены и 1, если найдены? »
Наверное. Как Вы определяете что «найдены» и что «не найдены»?
Ребят. Начальство лютует и я понять не могу, что от меня хотят.
Есть 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.) -> КОД ОШИБКИ
ВСЁ! Готовый скрипт для передачи кол-ва событий системе мониторинга:
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.