每天晚上都会运行一个任务来检查是否有任何计划任务的最后结果不等于 0x0。如果计划任务出现错误(如 0x1),则会自动向我发送电子邮件。由于某些任务每周只运行一次,有时会发生导致不等于 0x0 的错误,因此每晚都会发送一封包含错误消息的电子邮件,因为最后结果列仍然显示最后结果 0x1。但是,如果我解决了问题,我想手动将最后结果列设置为 0x0,这样我就不会每晚都收到包含错误消息的电子邮件。
那么是否可以手动(或通过脚本)将计划任务的最后结果设置为 0x0?
@harrymc。查看下面发送电子邮件的脚本。我可以轻松添加一个标准来忽略结果 0x1(或其他代码),但这不是解决方案,因为大多数情况下,这个结果是一个真正的错误,必须通过电子邮件发送。
set [email protected]
set SMTPServer=SMTPserver
set PathToScript=c:\scripts
set [email protected]
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%"
)
答案1
这是解决您问题的方法,尽管它不是您问题的答案。您只想查看任务今天跑的并且具有非零状态,对吗?
在 Windows 7 上,schtasks /query
报告日期格式为 n/n/nnnn(不带前导零),而命令date
使用 nn/nn/nnnn(带前导零)。因此,要以 n/n/nnnn 格式获取今天的日期,我会这样做
设置today_temp1=/%日期:~4% 设置today_temp2=%today_temp1:/0=/% 设置今天=%today_temp2:〜1%
如果schtasks
和date
在 XP 上兼容,那么您可以放弃上述操作。如果您知道一种更简洁的方法来删除日期的前导零,请告诉我。
然后将您的更改findstr
为findstr "TaskName Last"
,这样您就会获得 TaskName、Last Run Time 和 Last Result。并将您的更改Sub
为:
:子 设置行=%* 设置 BOL=%Line:~0,8% 设置 MOL=%Line:~38% if /i "%BOL%"=="任务名称" ( 设置名称=%MOL% 转到:eof ) if /i "%BOL%"=="上次运行" ( REM 将日期和时间分开。 呼叫 :Sub2 %MOL% 转到:eof ) 设置结果=%MOL% echo 任务名称=%name%,上次运行=%lastrun%,任务结果=%result% 如果不是 %result%==0 ( 如果 %lastrun%==%today% ( ︙ 转到:eof :Sub2 设置 lastrun=%1 REM 上次运行时间为 %2。 转到:eof
答案2
这是解决您问题的方法,尽管它不是您问题的答案。您只想查看已运行但失败的任务自从你上次看,对吧?因此,请记录已报告的任务失败情况。
创建空文件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