为什么只在Windows批处理文件的第一行执行而在命令行外壳中执行所有三行?


171

我有一个批处理文件,可以执行三个Maven命令,一个接一个。每个命令都可以在脚本中成功执行-单独执行!但是,当我将所有三个命令添加到同一文件中时,只有第一个命令在脚本退出之前执行。知道为什么吗?

mvn install:install-file -DgroupId=gdata -DartifactId=base -Dversion=1.0 -Dfile=gdata-base-1.0.jar  -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=gdata -DartifactId=blogger -Dversion=2.0 -Dfile=gdata-blogger-2.0.jar  -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=gdata -DartifactId=blogger-meta -Dversion=2.0 -Dfile=gdata-blogger-meta-2.0.jar  -Dpackaging=jar -DgeneratePom=true

另外,如果我复制所有三个命令并将它们粘贴到命令外壳程序(cmd.exe)中,它们将一个接一个地执行而没有问题。因此,这显然是dos批处理文件中的一些问题。


2
真是巧合:我来到这里时遇到的是相同的问题,并且批处理文件中的命令也一样—多行“ mvn install:install-file” :-D
fishbone


1
@fishbone以及您和OP都享有1.3k的声誉
。– p_champ

Answers:


297

Maven使用批处理文件来开展业务。对于任何批处理脚本,您都必须使用call命令来调用另一个脚本,以便它知道在被调用脚本完成后返回到您的脚本。尝试添加call所有命令。

您可以尝试的另一件事是使用start应该类似工作的命令。


1
我之前已将其放入antWindows批处理文件中,并且call需要ant执行该文件。没有call批处理的对象将在第一个命令后停止,因此后两个命令将不执行。 microsoft.com/resources/documentation/windows/xp/all/proddocs/…上的更多信息call
Owen,2010年

22
start将产生一个新窗口,并且这三个命令将并行运行。如果您需要它们同步运行,请使用call
akf 2010年

11
脚本环境以这种方式行事到底有何意义?如果我用两个命令编写了脚本,我希望这些命令可以执行。我不希望环境仅仅因为这些命令之一恰好被实现为脚本本身而决定停止执行我的脚本。
bames53 2013年

3
@ bames53:这是源自DOS的限制,该限制延续到Windows中命令提示符的现代实现中。由于Microsoft的目标是保持向后兼容性,因此就是结果。
Jeff Mercado 2013年

2
call pause如果您想保持cmd窗口打开,请在末尾添加(不带引号)
JinSnow

28

call帮助。但是今天没有。

这是我解决的方法:

Bat文件的内容(如果您要在cmds错误之一时停止批处理)

cmd1 && ^
cmd2 && ^
cmd3 && ^
cmd4

Bat文件的内容(如果您希望在cmds错误之一时继续进行批处理)

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4

(这里的第一个示例等效于cmd1 && cmd2 && cmd3 && cmd4,基本上使所有命令都
变成

2
真正。我之所以这样写是因为它是一个bat文件,大多数情况下您将有多个(可能很长)命令,一行中的4个命令对将来的维护不利。可读性是编写优秀程序的关键,因此它们在不同的方面。
Manohar Reddy Poreddy

1
此解决方案为我解决了问题。该call解决方案是不停止的错误,这个人做。
蒂姆(Tim)

9

要从一个脚本执行更多的Maven构建,您应通过以下方式使用Windows 调用函数:

call mvn install:install-file -DgroupId=gdata -DartifactId=base -Dversion=1.0 -Dfile=gdata-base-1.0.jar  -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -DgroupId=gdata -DartifactId=blogger -Dversion=2.0 -Dfile=gdata-blogger-2.0.jar  -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -DgroupId=gdata -DartifactId=blogger-meta -Dversion=2.0 -Dfile=gdata-blogger-meta-2.0.jar  -Dpackaging=jar -DgeneratePom=true


1

尝试编写以下批处理文件并执行它:

Echo one
cmd
Echo two
cmd
Echo three
cmd

仅执行前两行。但是,如果在命令提示符下键入“ exit”,则会处理接下来的两行。这是一个加载另一个的shell。

为确保这不是脚本中发生的事情,只需在第一个命令结束时键入“退出”即可。

HTH!


不太可能;Maven确实使用了批处理文件,这就是为什么他们需要使用call。它不是没有终止的嵌套shell。
乔伊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.