环境: Windows Server 2008 R2
Microsoft Windows任务计划程序执行 DoThis.cmd 文件,该文件始终在事件201(成功)中返回ERRORLEVEL,即使它失败了:
任务计划程序成功已完成任务“\为何无法执行此任务失败”, 实例“{c8655567-5f1c-4eb2-a2e1-91d2cd0405be}”,操作“C:\ Windows \ SYSTEM32 \ cmd.exe”,返回码为399.
如果存在非零ERRORLEVEL,我希望它返回事件202(失败),如果返回零则返回事件201(成功)。
我的批处理文件 DoThis.cmd 包含
RETURN 399
谢谢你, 〜肖恩
答案 0 :(得分:0)
我不相信默认情况下这是可能的。 任务本身已成功完成,因为它在预定时间运行并启动了您想要的任何应用程序。其中一个应用程序引发错误的事实不是任务计划程序的关注点。
但是,我能够实现几乎你想要的东西:你可以在其中一个动作上引发错误 203 (不是任务本身)通过确保任务无法找到它应该作为任务的一部分运行的程序。
所以我创建了一个运行3个动作的任务:
MyBatch.cmd 文件包含以下代码:
@echo off
if exist MyExe.exe del MyExe.exe
if exist result.cmd del result.cmd
set myError=0
:: *********** Do all your processing here **********
:: .....
:: Store your specific error code in %myError%, or to 0 to indicate success e.g.:
set myError=399
:: .....
:: *********** End batch file with following lines **********
if /I %myError% EQU 0 (
:: No error, so let's copy some small executable that the task can actually run
:: without impacting the results of the task
copy /y C:\Windows\System32\ipconfig.exe MyExe.exe > nul
)
:: Create a batch file that will instantly exit using the original error code
:: created in this one
echo exit /b %myError% > result.cmd
exit /b %myError%
(或者没有使显示混乱的评论):
@echo off
if exist MyExe.exe del MyExe.exe
if exist result.cmd del result.cmd
set myError=399
if /I %myError% EQU 0 (
copy /y C:\Windows\System32\ipconfig.exe MyExe.exe > nul
)
echo exit /b %myError% > result.cmd
exit /b %myError%
每当您的批处理文件需要引发错误时,您将 myError 变量设置为您想要返回的值(我更喜欢使用我自己的变量而不是依赖于ERRORLEVEL系统var,它可以几乎任何行动都可以重置。)
在脚本结束时,一些代码检查myError var是否包含0(这意味着没有发生错误)。如果是,则批处理创建名为 MyExe.exe 的可执行文件,该任务将在此批处理文件结束后立即运行。但是,如果 myError 包含不同的错误值,则不会创建MyExe文件 ,这会在尝试下次运行任务时触发203错误。< / p>
最后,还创建了一个 Result.cmd 文件,因此它可以作为任务的最后一个操作运行,冒泡您在第一个任务中创建的错误代码。
注意:MyExe文件只是 IpConfig.exe 的副本。我选择那个可执行文件只是因为AFAIK在所有Windows版本上都可用,它很小,它只是列出信息,因此它不能通过作为任务的一部分运行来破坏任何东西。