C# 未在CMD上返回ExitCode
我目前正在开发一个WPF应用程序,它提供了可在C# 未在CMD上返回ExitCode,c#,wpf,batch-file,cmd,exit-code,C#,Wpf,Batch File,Cmd,Exit Code,我目前正在开发一个WPF应用程序,它提供了可在Windows事件日志中找到的ExitCodes 在某些情况下,我需要立即取消执行。 因此,我使用Environment.Exit(someInteger)。 还需要通过批处理启动它,并检查错误级别是否不是0 通过VisualStudio输出控制台输出: The program '[6908] MyApp.vshost.exe: Program Trace' has exited with code 0 (0x0). The program '
Windows事件日志中找到的ExitCode
s
在某些情况下,我需要立即取消执行。
因此,我使用Environment.Exit(someInteger)
。
还需要通过批处理启动它,并检查错误级别是否不是0
通过VisualStudio输出控制台输出:
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).
cd MyVisualStudioDebugDir
MyApp.exe
echo %errorlevel%
=> returns 0
CMD输出:
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).
cd MyVisualStudioDebugDir
MyApp.exe
echo %errorlevel%
=> returns 0
为什么我在调用环境时在这里得到0。退出(3)
?我不是100%确定,但这可能与您在脚本中调用EXE的方式有关。为了模拟您的情况,我创建了一个简单的WPF应用程序,它通过Environment.Exit(3)立即退出然后是一个简单的test.cmd
脚本:
@echo off
start /wait TestApp.exe
echo %ERRORLEVEL%
实际上,发出的回声是3
更新:我注意到,如果在没有/wait
选项的情况下使用start
,则错误级别设置不正确。我认为这是因为start
不会等到应用程序退出后再继续。因此,您可以使用start/wait TestApp.exe
或简单地调用TestApp.exe
。我已经更新了上面的例子
在命令行上,CMD.EXE不会等待应用程序运行
终止,控制立即返回到命令提示符
在命令内,脚本CMD.EXE将暂停初始脚本并等待
在继续之前终止应用程序
因此,将应用程序启动命令放在批处理文件中,并在cmd中运行该批处理文件
myBat.bat
MyApp.exe
echo %errorlevel%
错误级别将是正确的。我当前正在调用MainClass构造函数中的.Exit(),并从VS Debug目录启动exe。对我来说,它不起作用:(我遗漏了什么?我更新了答案。我相信如果没有/wait
选项(或者简单地使用呼叫
),就不能使用启动
)。这就是问题所在:D我真的不明白为什么,但它已经解决了。多亏了我的直觉,我倾向于一种可能的竞争条件。如果脚本在应用程序退出之前检查ERRORLEVEL值,那么你就看不到更新的错误代码。/wait
选项或使用call
可以防止脚本在应用程序退出之前继续运行这个问题实际上是不存在的。如果您使用start/wait MyApp.exe
的结果与仅使用MyApp.exe
的结果相同。原始问题没有提到任何start
命令……您确定示例中的前几行没有放在括号内吗?在这种情况下,您需要启用延迟扩展并使用e> echo!errorlevel!
改为“程序跟踪”是一个辅助进程,为VS2015诊断工具提供信息。它从实际程序中收集ETW事件,以便VS可以向您显示cpu和内存使用统计信息。当然,它没有问题,看到它以代码0退出是正常的。您使用%errorlevel%的方式仅适用于控制台模式的应用程序。WPF应用程序启动时没有任何错误cmd.exe正在等待它完成。