如何从Task Scheduler启动的cmd文件中获取代码202?

时间:2016-06-03 21:50:38

标签: windows batch-file cmd errorlevel

环境: 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

谢谢你,  〜肖恩

1 个答案:

答案 0 :(得分:0)

我不相信默认情况下这是可能的。 任务本身已成功完成,因为它在预定时间运行并启动了您想要的任何应用程序。其中一个应用程序引发错误的事实不是任务计划程序的关注点。

但是,我能够实现几乎你想要的东西:你可以在其中一个动作上引发错误 203 (不是任务本身)通过确保任务无法找到它应该作为任务的一部分运行的程序。

所以我创建了一个运行3个动作的任务:

  1. MyActualBatch.cmd
  2. MYEXE.EXE
  3. MyResult.cmd
  4. 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版本上都可用,它很小,它只是列出信息,因此它不能通过作为任务的一部分运行来破坏任何东西。