批处理脚本在调用exe后错误退出

3

好的,我有一个名为WC_Error_Resolution的程序,是使用C#编写的(C#控制台应用程序,使用.NET 4.0)。这个程序在运行时返回0、1或2,这取决于程序执行期间的操作。如果我从cmd.exe中调用它,一切都正常。然而,这里让我感到困惑的是:我有一个测试批处理脚本(真实的脚本要复杂得多),像这样调用该程序:

    ECHO Start
    WC_Error_Resolution.exe file1.xml file2.xml inifile.ini log1.log log2.log
    ECHO ERRORLEVEL=%ERRORLEVEL%

这里的问题在于第二个“echo”永远不会被执行。一旦脚本调用程序并退出批处理脚本,它就无法执行第二个“echo”。然后我决定尝试:
    ECHO Start
    START /B /WAIT "" WC_Error_Resolution.exe file1.xml file2.xml inifile.ini log1.log log2.log
    ECHO ERRORLEVEL=%ERRORLEVEL%

这次,它按预期运行。我创建了许多批处理脚本,像第一个示例一样调用.exe文件,从未遇到过这样的问题。是什么原因导致WC_Error_Resolution.exe程序返回后脚本停止执行?
编辑 ----------------------------------------------------- 现在我的另一个程序也出现了这个问题。这两个程序都引用了System.Xml.Linq。这些程序可以在Windows 7、Windows 8和Windows Server 2012 R2上进行脚本编写。但在Windows Server 2008 R2上无法执行这些程序,也不显示任何错误。脚本根本没有执行程序或程序调用下面的命令。需要注意的是,这是在启用了WoW64的64位环境中运行的32位程序。难道.NET应用程序在Windows Server 2008 R2上运行时存在一些我不知道的问题吗?

项目的构建属性将目标平台指定为“Any CPU”。我应该改成x86吗?我使用/B是因为对exe的调用是更大脚本的一部分,所以我不希望在执行期间出现第二个窗口。应用程序正常运行,并在未更改任何内容时以退出代码0退出,在更改特定文件时以1退出,并在错误时以2退出。在VS中运行良好。当我像第一个示例那样编写脚本时,第二个echo不会被执行,但如果我在脚本返回后在命令行中键入“ECHO ERRORLEVEL =%ERRORLEVEL%”,则会得到正确的退出代码。 - Disco Globeulon
请参阅Visual Studio中的“Any CPU”目标是什么意思?,明确使用x86配置构建您的控制台应用程序并测试是否有所不同。 - Mofi
我会引用https://dev59.com/c3RB5IYBdhLWcg3wxZ_Y 来解释“Any CPU”的含义。基于此,我不认为在执行行为上会有任何差异,但我会尝试一下并回来报告结果。 - Disco Globeulon
start /B /W ""CREATE_NEW_PROCESS_GROUP 添加到进程创建标志中。在 64 位 Windows 7 中,当我将运行 C:\Windows\System32\where.exe 作为测试用例时,与不使用 /B 选项时传递给 CreateProcessW 的参数相比,这是唯一的主要区别。如果您删除 /B 选项(必要时在末尾添加 pause),它是否会在新窗口中正确回显? - Eryk Sun
你可能需要在调试器下逐步执行批处理文件。在 cmd!BatLoop 上设置断点。这个函数实现了分发循环。在这种情况下,它将分发到 cmd!ExtComcmd!Start,然后是 cmd!eEcho - Eryk Sun
显示剩余2条评论
1个回答

0

这个问题的答案(通过使用C++示例)在以下问题的答案中得到了回答:

如何从Windows命令行获取应用程序退出代码?

如果程序从控制台分离,则批处理文件会继续运行,而程序则在运行时,START /B /WAIT是正确的解决方法来获取errorlevel。如果您无法看出为什么C#程序从控制台分离,您可能需要根据您的C#程序提取另一个问题。


这不再是一个问题,因为我们已经改变了流程来解决它。然而,我要说的是,虽然链接的答案很有用,但并不一定适用,因为被调用的程序是控制台程序。除非对于C#控制台应用程序也适用相同的方法。 - Disco Globeulon
是的:控制台应用程序可以分离控制台,并且可以使用窗口,这可能是您的应用程序的情况,这就是我做出注释的原因。 - Brian Tompsett - 汤莱恩
如果是这样的话,你认为这个问题会在所有机器上出现吗?它只发生在我同事的电脑上。 - Disco Globeulon

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