【问题标题】:ExitCode not returned on CMD退出代码未在 CMD 上返回
【发布时间】:2015-12-16 15:08:24
【问题描述】:

我目前正在开发一个 WPF 应用程序,该应用程序提供 ExitCodes,可在 Windows Eventlog 中找到。

在某些情况下,我需要立即取消执行。 因此我使用Environment.Exit(someInteger)。 还有就是需要批量启动,检查ErrorLevel is NOT 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

为什么我打电话时这里是 0 Environment.Exit(3)

【问题讨论】:

  • 你确定你的例子中前面的行没有放在括号内吗?在这种情况下,您需要启用延迟扩展并改用echo !errorlevel!
  • “程序跟踪”是提供 VS2015 诊断工具的辅助进程。它从您的真实程序中收集 ETW 事件,以便 VS 可以向您显示 cpu 和内存使用统计信息。当然没有问题,看到它以代码 0 退出是正常的。您使用 %errorlevel% 的方式仅适用于控制台模式应用程序。 WPF 应用程序无需等待 cmd.exe 完成即可启动。

标签: c# wpf batch-file cmd exit-code


【解决方案1】:

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

@echo off

start /wait TestApp.exe
echo %ERRORLEVEL%

回显的内容实际上是3

更新:我注意到如果在没有/wait 选项的情况下使用start,则错误级别设置不正确。我相信这是因为start 在继续之前不会等待应用程序退出。因此,您可以使用start /wait TestApp.exe 或简单地使用call TestApp.exe。我已经更新了上面的例子。

【讨论】:

  • 我目前在 MainClass 的构造函数中调用 .Exit() 并从我的 VS Debug 目录启动 exe。对我来说它不起作用:(我错过了什么
  • 我更新了答案。我相信start 不能在没有/wait 选项的情况下使用(或者干脆使用call)。
  • 这就是问题所在:D 我真的不明白为什么,但它已经解决了。非常感谢
  • 我的直觉倾向于可能的比赛条件。如果脚本在应用程序退出之前检查 ERRORLEVEL 值,那么您将看不到更新的错误代码。 /wait 选项或call 的使用可防止脚本在应用程序实际退出之前继续运行。
  • 如果您使用start /wait MyApp.exe,结果与MyApp.exe 相同。最初的问题没有提到任何start 命令...
【解决方案2】:

在命令行上,CMD.EXE 不会等待应用程序 终止并且控制立即返回到命令提示符。

在命令脚本中,CMD.EXE 将暂停初始脚本并等待 让应用程序在继续之前终止。

Description about cmd and exit codes

因此,将您的应用程序启动命令放入一个批处理文件并在 cmd 中运行该批处理文件。

myBat.bat

MyApp.exe
echo %errorlevel%

错误级别将是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    相关资源
    最近更新 更多