2014-10-01 61 views
2

好吧,我有一个名为WC_Error_Resolution的程序,它是用C#(.NET 4.0的C#控制台应用程序)编写的。此程序根据运行程序时所做的操作返回0,1或2。如果我从cmd.exe调用它,一切工作正常。但是,这里是我感到困惑的地方。我有一个测试批处理脚本(真正的一个大得多)调用它像:批处理脚本在调用exe后错误地退出

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

的这里的问题是,第二回声永远不会被执行。第二个脚本进入程序,它调用它并退出批处理脚本。然后我决定尝试:

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位程序。在Windows Server 2008 R2上运行的.NET应用程序有一些我不知道的问题吗?

+0

您的'WC_Error_Resolution.exe'应用程序是32位还是64位控制台应用程序?为什么在第二批中使用'/ B'? 'main()'中的'return 0;'(或1或2)不会退出您的控制台应用程序?在Visual Studio中以调试模式运行应用程序,并检查它是如何真正退出的。 – Mofi 2014-10-01 21:29:12

+0

项目的构建属性将目标平台指定为“任何CPU”。我应该改为x86吗?我使用/ B是因为对exe的调用是一个更大的脚本的一部分,所以我不想在执行过程中出现第二个窗口。应用程序正常运行,并且在没有任何更改时退出代码为0,当特定文件被更改时为1,错误时为2。在VS中运行良好。当我像第一个例子那样编写脚本时,第二个echo将不会被执行,但是如果在脚本返回后在命令行输入'ECHO ERRORLEVEL =%ERRORLEVEL%',我会得到正确的退出代码。 – Josh 2014-10-02 12:50:15

+0

请参阅[Visual Studio“任何CPU”目标是什么意思?](http://stackoverflow.com/questions/516730/)使用x86配置显式构建您的控制台应用程序,并测试是否有所作为。 – Mofi 2014-10-02 14:02:13

回答

0

这回答(通过使用C++示例的)中的答案的问题:

How do I get the application exit code from a Windows command line?

如果程序从控制台分离然后批处理文件继续在程序运行和START /B /WAIT正确的解决方法是获取errorlevel。如果你不明白为什么C#程序从控制台分离出来,你可能想要问一个基于C#程序摘录的另一个问题。

+0

因为我们已经改变了解决此问题的流程,所以这不再是个问题。但是,我会说,链接的答案虽然有用,但不一定适用,因为被调用的程序是控制台程序。这是除非同样适用于C#控制台应用程序。 – Josh 2015-01-22 20:59:48

+0

是的:控制台应用程序可以分离控制台,并可能使用窗口,这可能是您的应用程序的情况,这就是我制作笔记的原因。 – 2015-01-22 22:00:52

+0

如果是这样的话,你认为这个问题会出现在机器上吗?它只发生在我的同事的机器上。 – Josh 2015-02-05 17:55:56

相关问题