【发布时间】:2015-04-03 19:31:27
【问题描述】:
我有一个控制台应用程序。与此应用程序的交互是通过 TCP/IP 完成的。
我也有一个测试框架,它基本上是 BATCH 脚本的集合(...不是我的错)。这个测试框架对每个测试所做的基本上是这样的:
-
start /min "myapplication.exe"并等待,直到收到应用程序已启动并运行的验证。 - 通过 TCP/IP 向此应用程序发送命令,接收其回复,并检查时间和值是否与特定测试的预期相符。
我目前遇到的一个问题是应用程序由于某些内部错误而过早退出。我想区分失败的测试和应用程序崩溃。我对此的唯一指示是应用程序的退出代码。
所以,我尝试了以下方法:
start /min cmd /c "myapplication.exe || echo %errorLevel% > exitcode.txt"
然后在测试脚本中,
if exist exitcode.txt (
set /p exitcode=<exitcode.txt
echo ERROR: myapplication.exe returned exitcode %exitcode%.
goto error
) else (
goto do_processing
)
但由于某些奇怪的原因,文本文件从未出现,即使我有时会收到有关应用程序崩溃的对话框,即使我用已知的非零退出代码强行使其失败。测试只是通过do_processing 并且(当然)导致失败。
编辑 当我跑步时
start /min cmd /c "nonsense || echo %errorLevel% > test.txt"
我有时得到一个包含字符串 9009 的文本文件,但其他时候该文本文件包含字符串 0,或者有时是 1,...什么...?!
EDIT2 如果你输入
cmd /k "nonsense || echo %errorLevel%"
(注意/k 选项),您会在新窗口中看到0,但如果您随后输入echo %errorlevel%,您会得到1....
我知道批次不是很理智,但它至少应该是始终如一的疯狂...
对这里可能发生的事情有什么想法吗?
【问题讨论】:
-
您必须使用 /wait 选项来获取退出代码。这应该首先打败使用 start 的点。当需要进行错误检查时,避免一劳永逸。
-
@Hans Passant:我认为这行不通,因为如果您使用
start,退出代码将不会传递给调用脚本。您应该改用call。它的行为类似于start /wait,但传递变量。检查这个:stackoverflow.com/questions/13257571/… -
@HansPassant: 但
start /wait表示脚本执行将阻塞。然后脚本就不能继续向它发出命令... -
标签: windows batch-file console-application command-prompt exit-code