Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Корректное возвращение Errorlevel (http://forum.oszone.net/showthread.php?t=300229)

hunk3r 24-05-2015 14:12 2510860

Корректное возвращение 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?

Georgio 24-05-2015 15:05 2510885

Цитата:

Цитата hunk3r
Как выводить errorlevel именно команды find, чтобы убедиться, что команда сработала верно. »


Команда
Код:

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

Iska 24-05-2015 15:23 2510888

Цитата:

Цитата hunk3r
Как выводить errorlevel именно команды find, чтобы убедиться, что команда сработала верно. »

В приведённом Вами контексте сие будет затруднительно, поскольку Вы как раз разбираете вывод «find.exe» по «for /f».

hunk3r 24-05-2015 15:25 2510889

Благодарю за ответы. Значит, в моем примере смысла выводить errorlevel нет, если я увижу число событий?

hunk3r 24-05-2015 23:43 2510996

В дальнейшем - делать call с уже вписанными параметрами и получать на почту меседж о текущем состоянии по нужным эвентам нужных серверов.

hunk3r 25-05-2015 10:24 2511061

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

Iska 25-05-2015 11:34 2511087

  1. «%errorlevel%» от чего?
  2. «else goto A» и следом сразу «:A …» не имеет смысла.

hunk3r 25-05-2015 11:57 2511105

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

hunk3r 25-05-2015 13:04 2511119

Сделал. Конечный скрипт вызываемого файла:
Код:

@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 2511136

Цитата:

Код:

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


Код:

set /a result = -%errorlevel%
А зачем «-»?

hunk3r 25-05-2015 14:53 2511156

Минус начальству нужен.
Интересно, а можно сделать errorlevel=0, если события не найдены и 1, если найдены?

Iska 25-05-2015 15:09 2511165

Цитата:

Цитата hunk3r
Интересно, а можно сделать errorlevel=0, если события не найдены и 1, если найдены? »

Наверное. Как Вы определяете что «найдены» и что «не найдены»?

hunk3r 25-05-2015 15:35 2511180

Ребят. Начальство лютует и я понять не могу, что от меня хотят.
Есть 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 2511239

ВСЁ! Готовый скрипт для передачи кол-ва событий системе мониторинга:
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%



Время: 19:42.

Время: 19:42.
© OSzone.net 2001-