好的,我有一个名为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上运行时存在一些我不知道的问题吗?
start /B /W ""
将CREATE_NEW_PROCESS_GROUP
添加到进程创建标志中。在 64 位 Windows 7 中,当我将运行C:\Windows\System32\where.exe
作为测试用例时,与不使用/B
选项时传递给CreateProcessW
的参数相比,这是唯一的主要区别。如果您删除/B
选项(必要时在末尾添加pause
),它是否会在新窗口中正确回显? - Eryk Suncmd!BatLoop
上设置断点。这个函数实现了分发循环。在这种情况下,它将分发到cmd!ExtCom
或cmd!Start
,然后是cmd!eEcho
。 - Eryk Sun