批处理文件中的奇怪行为?

时间:2014-06-25 12:45:56

标签: batch-file mstest

我有一个批处理文件,用于使用mstest执行一系列测试运行。

mstest /testmetadata:matrix.vsmdi /testlist:"Build Server" /runconfig:TestRunConfig_Matrix.testrunconfig /resultsfile:BuildServer.trx > %outPath%
mstest /testmetadata:matrix.vsmdi /testlist:"Build Server API" /runconfig:TestRunConfig_Matrix.testrunconfig /resultsfile:BuildServer_API.trx >> %outPath%
mstest /testmetadata:matrix.vsmdi /testlist:"Build Server Scheduler" /runconfig:TestRunConfig_Matrix.testrunconfig /resultsfile:BuildServer_Scheduler.trx >> %outPath%

第一行正确输出到新的日志文件%outPath%。我希望第2行和第3行附加到此日志文件。

然而,奇怪的是我发现第一行正确地创建了一个新的日志文件,但第二行覆盖了它,但第三行正确地附加到第二行的输出。因此,我永远无法看到第一行的输出!

我是否会失去理智,或者对此有合理的解释?

1 个答案:

答案 0 :(得分:0)

在所有可能性中,你确实失去了理智。这是IT业务中的一个事实 - 通常是因为老板的IT Luddite造成的。

至于你的问题,我建议由于mstest是一个可执行文件,你的程序将并行运行三个命令,而不是顺序运行。因此,写入文件的数据可能取决于进程终止的顺序。

理论上的解决方案是强制顺序调用这三个进程,

start /w "" mstest /testmetadata:matrix.vsmdi /testlist:"Build Server" /runconfig:TestRunConfig_Matrix.testrunconfig /resultsfile:BuildServer.trx > %outPath%

(即每行加start /w "")这应该只在当前终止时开始以下过程。

空兔子的耳朵很重要。这是创建的窗口的标题 - 它可以是您选择的任何字符串,但必须存在并且是第一个,否则厄运将会发生。好吧,不是完全没有厄运,但是批处理会选择行中第一个引用的字符串作为窗口标题,并可能将其作为参数忽略,从而导致意外结果。


重定向和start不能很好地一起玩。

我试试

CALL mstest /testmetadata:matrix.vsmdi /testlist:"Build Server" /runconfig:TestRunConfig_Matrix.testrunconfig /resultsfile:BuildServer.trx > %outPath%

哪个应该解决问题。

如果这不起作用,可以尝试创建一个简单的批处理文件:

@echo off&setlocal
mstest /testmetadata:%~1 /testlist:"%~2" /runconfig:%~4 /resultsfile:%~5 > %~6
exit

并使用start调用它:

start /w "" simplebatch matrix.vsmdi "Build Server" TestRunConfig_Matrix.testrunconfig BuildServer.trx %outPath%

(以及其他两个实例的类似行)