因此,当输出日志中突然出现以下内容时,我的批处理脚本运行得很好:
21:27:13.99 c:\apps\w7lab-scripting>some-command
Error 3221225786
^CTerminate batch job (Y/N)?
然后脚本就停止了。
批处理脚本在会话零中运行,所以我知道它没有收到真正的 control-C,并且我的代码都没有调用GenerateConsoleCtrlEvent
所以不可能是这样。唯一的线索是some-command
当时正在与交互式应用程序进行通信,并且that应用程序的控制台收到一个control-C。预期的行为是some-command
显示其他应用程序的退出代码,然后使用相同的代码退出。如果批处理脚本没有完全停止的话,它会适当地处理错误。
这里发生了什么?
这里的魔力在于退出代码 3221225786,又名 0xC000013A 或 STATUS_CONTROL_C_EXIT。
交互式应用程序收到了 control-C,但没有捕获它,因此正如预期的那样,它被 STATUS_CONTROL_C_EXIT 中止。这some-command
应用程序正确地将其报告为远程应用程序的退出代码,并将其传递回批处理脚本。
我没有意识到的是cmd.exe
通过检查子进程是否返回 STATUS_CONTROL_C_EXIT,以完全相同的方式检测批处理脚本中的 control-C。因此,通过返回此错误代码,我无意中停止了批处理脚本。
这可以通过一个简单的批处理脚本来演示:
cmd /c exit 3221225786
echo hello
当运行时,会产生
C:\working\test>cmd /c exit 3221225786
^CTerminate batch job (Y/N)?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)