Cmd ERRORLEVEL无法报告regsvr32的进程退出代码,为什么?

Cmd ERRORLEVEL无法报告regsvr32的进程退出代码,为什么?,cmd,Cmd,在Windows 7 SP1上,从CMD窗口运行命令regsvr32 none.dll,regsvr32将失败,退出代码为3。这是regsvr32的预期行为,如中所述 Procmon也验证了这一点 然而,当使用echo%ERRORLEVEL%检查regsvr32的退出代码时,我得到了零。为什么? 感谢马克的评论。我刚刚被CMD的鬼鬼祟祟行为绊倒了 要了解像regsvr32这样的GUI进程的退出代码,CMD命令行必须是: start /wait regsvr32.exe none.dll reg

在Windows 7 SP1上,从CMD窗口运行命令regsvr32 none.dll,regsvr32将失败,退出代码为3。这是regsvr32的预期行为,如中所述

Procmon也验证了这一点

然而,当使用echo%ERRORLEVEL%检查regsvr32的退出代码时,我得到了零。为什么?


感谢马克的评论。我刚刚被CMD的鬼鬼祟祟行为绊倒了

要了解像regsvr32这样的GUI进程的退出代码,CMD命令行必须是:

start /wait regsvr32.exe none.dll
regsvr32的特殊之处在于:如果我们运行regsvr/s xxx.dll,/s会使regsvr完全静音,看起来非常像一个CUI程序。因此,用户更容易陷入困境


但如果我们在.bat/.cmd批处理脚本中执行regsvr32 none.dll,则不需要start/wait。命令提示符与批处理脚本内部的这种差异经常给粗心的人带来麻烦。叹气。

因为您正在键入,所以没有可用的退出代码,所以A。这不是编程问题B请参见开始/?该部分表示,当执行32位GUI应用程序时,CMD.EXE不会等待应用程序终止,然后返回命令提示符。如果在命令脚本中执行%errorlevel%,则不会出现这种新行为。键入时,命令脚本%errorlevel%在每行末尾都被清除。关于errorlevel何时更改,似乎有一条模糊的规则。在我今天的例子中,如果CMD命令行成功启动GUI程序regsvr32=CreateProcess successfulyy,无论regsvr32是否成功退出,错误级别都不会改变,无论它是0还是其他。请注意,帮助中的旧行为是OS/2 CMD.exe,它被移植到NT并由IBM工程师编写。我认为她做了一件精神错乱的事。新行为由Microsoft程序员更新。还要注意标题的变化。她很久以前是一名工程师。现在人们是程序员而不是工程师,通常PLC几乎都是由工程师编程的。