CMD未返回ExitCode

4

我目前正在开发一个WPF应用程序,它提供了ExitCode以在Windows事件日志中找到。

在某些情况下,我需要立即取消执行。 因此,我使用Environment.Exit(someInteger)。 还需要通过批处理启动它,并检查ErrorLevel不是0


通过VisualStudio OutputConsole输出:

 The program '[6908] MyApp.vshost.exe: Program Trace' has exited with code 0 (0x0).
 The program '[6908] MyApp.vshost.exe' has exited with code 3 (0x3).

CMD输出:

cd MyVisualStudioDebugDir
MyApp.exe
echo %errorlevel% 
=> returns 0

为什么我调用 Environment.Exit(3) 后会得到0?

2
你确定你的示例中前面的行没有放在括号里吗?如果是这种情况,你需要启用延迟扩展并使用 echo !errorlevel! - Aacini
2
“程序跟踪”是一个辅助进程,它为VS2015诊断工具提供数据。它从您的真实程序中收集ETW事件,以便VS可以向您显示CPU和内存使用情况统计信息。当然,它没有问题,看到它以代码0退出是正常的。您正在使用%errorlevel%的方式只适用于控制台模式应用程序。WPF应用程序启动时不需要cmd.exe等待其完成。 - Hans Passant
2个回答

3

我不确定,但这可能与您在脚本中调用EXE的方式有关。为了模拟您的情况,我创建了一个简单的WPF应用程序,通过Environment.Exit(3);立即退出,然后是一个简单的test.cmd脚本:

@echo off

start /wait TestApp.exe
echo %ERRORLEVEL%

回显的内容实际上是3

更新:我注意到如果使用start而没有/wait选项,ERRORLEVEL将无法正确设置。我相信这是由于start在继续之前不会等待应用程序退出。因此,您可以使用start /wait TestApp.exe或简单地使用call TestApp.exe。我已经更新了上面的示例。


我已更新答案。我相信start命令不能没有/wait选项使用(或者直接使用call命令)。 - Fizz
那就是问题所在:D我不太明白为什么,但问题已经解决了。非常感谢。 - Felix D.
1
我的直觉倾向于可能存在竞态条件。如果脚本在应用程序退出之前检查ERRORLEVEL值,则您将无法看到更新的错误代码。使用/wait选项或call命令可以防止脚本在应用程序实际退出之前继续执行。 - Fizz
KK现在明白了:D。谢谢! - Felix D.
2
如果您使用 start /wait MyApp.exe,则结果与仅使用 MyApp.exe 相同。原始问题中没有提到任何 start 命令... - Aacini
显示剩余2条评论

0
在命令行中,CMD.EXE 不会等待应用程序终止,而是立即返回到命令提示符。
在命令脚本中,CMD.EXE 将暂停初始脚本,并等待应用程序终止后才继续执行。 关于 cmd 和退出代码的说明 因此,将应用程序启动命令放入批处理文件中,在 cmd 中运行该批处理文件。

myBat.bat

MyApp.exe
echo %errorlevel%

错误级别将会是正确的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接