1

Каждую ночь запускается задача, которая проверяет, имеет ли какая-либо запланированная задача последний результат, не равный 0x0. Если в запланированных заданиях есть ошибка, например 0x1, мне автоматически отправляется электронное письмо. Поскольку некоторые задачи выполняются только еженедельно, а иногда возникает ошибка, которая не равна 0x0, каждую ночь отправляется электронное письмо с сообщением об ошибке, поскольку в столбце «Последний результат» по-прежнему отображается последний результат 0x1. Но я бы хотел установить для столбца Last Result значение 0x0 вручную, если я решил проблему, поэтому я не буду каждый вечер получать электронное письмо с сообщением об ошибке.

Так можно ли установить для заданных задач Last Result значение 0x0 вручную (или с помощью скрипта)?

@harrymc. Посмотрите локализованный скрипт, под которым отправляется электронное письмо. Я могу легко добавить критерий, чтобы игнорировать результат 0x1 (или другой код), однако это не решение, поскольку в большинстве случаев этот результат является реальной ошибкой и должен быть отправлен по электронной почте.

set YourEmailAddress=to@email.com
set SMTPServer=SMTPserver
set PathToScript=c:\scripts
set FromAddress=from@email.com

for /F "delims=" %%a in ('schtasks /query /v /fo:list ^| findstr /i "Taskname Result"') do call :Sub %%a
goto :eof

:Sub
set Line=%*
set BOL=%Line:~0,4%
set MOL=%Line:~38%
if /i %BOL%==Task (
set name=%MOL%
goto :eof
)
set result=%MOL%
echo Task Name=%name%, Task Result=%result%
if not %result%==0 (
echo Task %name% failed with result %result% > %PathToScript%\taskcheckerlog.txt
bmail %PathToScript%\taskcheckerlog.txt -t %YourEmailAddress% -a "Warning! Failed %name% Scheduled Task on %computername%" -s %SMTPServer% -f %FromAddress% -b "Task %name% failed with result %result% on CorVu scheduler %computername%"
)

2 ответа2

3

Вот решение вашей проблемы, хотя это не ответ на ваш вопрос.  Вы хотите видеть только те задачи, которые выполнялись сегодня и имеют ненулевой статус, верно?

В Windows 7 отчеты по запросам / запросам в формате schtasks /query представлены в формате n / n / nnnn (без начальных нулей), а команда date использует nn / nn / nnnn (с начальными нулями).  Итак, чтобы получить сегодняшнюю дату в формате n / n / nnnn, я бы сделал

set today_temp1=/%date:~4%
set today_temp2=%today_temp1:/0=/%
set today=%today_temp2:~1%

Если schtasks и date совместимы с XP, то вы можете отказаться от вышесказанного.  Если вы знаете более понятный способ убрать лидирующие нули из дат, скажите, пожалуйста.

Затем измените свой findstr на findstr "TaskName Last" , чтобы получить TaskName, Last Run Time и Last Result.  И измените свой Sub на:

:Sub
set Line=%*
set BOL=%Line:~0,8%
set MOL=%Line:~38%
if /i "%BOL%"=="TaskName" (
    set name=%MOL%
    goto :eof
)
if /i "%BOL%"=="Last Run" (
    REM Break date and time apart.
    call :Sub2 %MOL%
    goto :eof
)
set result=%MOL%
echo Task Name=%name%, Last Run=%lastrun%, Task Result=%result%
if not %result%==0 (
    if %lastrun%==%today% (
        ︙

goto :eof


:Sub2
set lastrun=%1
REM The Last Run time is %2.
goto :eof
0

Вот решение вашей проблемы, хотя это не ответ на ваш вопрос.  Вы хотите видеть только те задачи, которые были запущены и потерпели неудачу с момента последнего просмотра, верно?  Таким образом, ведите журнал о том, какие сбои задач были зарегистрированы.

Создайте пустые файлы reported0.txt и reported0.txt .  (Очевидно, вы можете изменить имена, если хотите.)

set YourEmailAddress , SMTPServer , PathToScript и FromAddress соответствующим образом.

del reported0.txt               > nul
ren reported1.txt reported0.txt > nul

for /F "delims=" %%a in ('schtasks /query /v /fo:list ^
                                            ^| findstr "TaskName Last"') do (
        call :Sub %%a
)
exit /b


:Sub
set Line=%*
set BOL=%Line:~0,8%
set MOL=%Line:~38%
if "%BOL%"=="TaskName" (
        set name=%MOL%
        exit /b
)
if "%BOL%"=="Last Run" (
        set run_date_time=%MOL%
        REM
Перерыв даты и времени, если вы хотите.
        exit /b
)
set result=%MOL%
if not %result%==0 (
        set pattern_string=@%name%@%run_date_time%@%result%@
        find "%pattern_string%" reported0.txt > nul
        if errorlevel 1 (
                REM error => not found in file => not previously reported.
                ︙           (
Сообщить об ошибке задачи по электронной почте.)
        )
        echo %pattern_string% >> reported1.txt
)
exit /b

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .