让 .bat 文件在运行命令后继续执行

23

我需要解决这个在Windows .bat文件上似乎非常简单的问题。过去10年里我一直全职使用Linux,所以当涉及到.bat脚本时,我对此并不熟悉。

我们有一些单元测试需要从这个.bat文件中运行,并且在测试运行后需要生成一个构建。

这个bat文件本身非常简单,我考虑将命令链接起来:

cls
echo "Running test suite - CRMSync"
echo 
echo 
REM from command: --static-backup
phpunit --bootstrap test/bootstrap_test.php --verbose --log-junit              
echo "Running  phploc for CRMSync"
phploc --count-tests --verbose > C:\CRMsync\testResults\phploc\index.html
echo "Executing phing"
phing

现在,除了phpunit命令之外,没有执行任何东西。我该如何处理呢? 单元测试运行良好,但我怀疑可能是在单元测试库中进程被终止了。有没有一种方法可以在某种程度上分离进程,或者让下面的其他命令运行起来?

感谢各位 StackOverflow 的用户,像往常一样,非常感谢您提供的任何帮助。


1
你正在错误的方向上搜索:如果phpunit崩溃,批处理将会继续。 - CharlesB
1
如果您注释掉PHPUnit调用,那么phploc和phing是否会执行? - CharlesB
2
这更多是[su]的事情... - fretje
1
你应该尝试理解它为什么会崩溃,而不是更改调用。肮脏的修复方法总会在以后反噬你(或者你的继任者)。 - CharlesB
@CharlesB 嘿,老兄,你是对的,phploc脚本没有输出任何内容就卡住了,我还以为它运行得很好。但是,如果你需要一个脚本在失败时继续运行,使用call有什么问题呢?有没有办法捕获脚本的返回状态?出于好奇,明天我会研究一下这个问题,一旦这个问题解决了,我可能很长一段时间都不会再碰Windows了。感谢你的建议,我点赞了你的评论,因为你花时间给我指路!;) - Stephane Gosselin
很高兴它能帮到你;不要忘记把它发布为答案 :) - CharlesB
5个回答

23

我曾经为自己编写的开发脚本遇到同样的问题,尝试了所有给出的解决方案都没有成功。最终,我使用了cmd /C

从Windows文档中得知:

运行命令,然后终止

例如,你可以按以下方式使用它:

cls
echo "Running test suite - CRMSync"
echo 
echo 
REM from command: --static-backup
cmd /C phpunit --bootstrap test/bootstrap_test.php --verbose --log-junit              
echo "Running  phploc for CRMSync"
cmd /C phploc --count-tests --verbose > C:\CRMsync\testResults\phploc\index.html
echo "Executing phing"
cmd /C phing

我希望你会发现这个对你有用。


这是我经验中正确的做法:它会等待命令完成后再传递到下一行。 - Luca Borrione
这很有帮助,只是一个小提示,我想使用%comspec% /C而不是cmd /C - omegastripes

16

与ujifgc发布的帖子类似,我在这些情况下使用“start /b…”。如果您将对phpunit的调用封装在另一个批处理文件中,则可以使用“call”。

类似于ujifgc发布的帖子,我在这些情况下使用“start /b …”。如果您将对phpunit的调用封装在另一个批处理文件中,您可以使用“call”。

1
这不会等待命令完成后再转到下一行。 - Luca Borrione

8

phpunit本身是否是一个批处理文件(因为我不怎么做PHP,所以对该工具不熟悉)?如果是,请尝试使用以下命令:

call phpunit --bootstrap test/bootstrap_test.php --verbose --log-junit

我遇到了一个与.bat文件相关的问题。一开始它调用了'composer update',然后运行了'7zip.exe -a ...'。第二个命令没有被执行。我尝试了'call composer update',现在它以正确的方式运行。我的'composer'命令也是一个.bat文件。它包括:"php "%~dp0composer.phar" %*" - Sergey Beloglazov

2
尝试使用start /WAIT phpunit ...来分叉进程并等待它,或者只需使用start phpunit ...来分叉并继续。帮助在这里:start /?

好的!谢谢。明天一早我会先看看这个,伙计。 - Stephane Gosselin

2

我使用以下命令启动Visual Studio Code和一个Node.js服务器:

start /b code .

cmd /k ng serve --build-optimizer --aot

但是在命令行中,%更新文本等出现了故障。

然后我改用以下命令:

cmd /C code .

cmd /k ng serve --build-optimizer --aot

这样服务器进度更新就不再出现故障了。


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