为什么只有这个Windows批处理文件的第一行执行但所有三行都在命令shell中执行?

wik*_*iki 163 windows cmd batch-file windows-7

我有一个批处理文件,一个接一个地执行三个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
Run Code Online (Sandbox Code Playgroud)

此外,如果我复制所有三个命令并将它们粘贴到命令shell(cmd.exe)中,它们会一个接一个地执行,没有任何问题.所以这显然是dos批处理文件的一些问题.

Jef*_*ado 280

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

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

  • `start`将导致生成一个新窗口,并且三个命令中的每一个都将并行运行.如果需要它们同步运行,请使用`call`. (20认同)
  • 对于脚本环境来说,这样做有何意义?如果我用两个命令编写脚本,我希望执行命令; 我不希望环境只是因为其中一个命令恰好被实现为脚本本身而决定停止执行我的脚本. (10认同)
  • @ bames53:这是一个源自DOS的限制,它继承了Windows中命令提示符的现代实现.由于微软的目标是保持向后兼容性,因此这就是结果. (3认同)
  • 如果要保持 cmd 窗口打开,请在末尾添加 `call pause`(不带引号) (3认同)

Man*_*ddy 22

call帮助.然而今天却没有.

这就是我解决它的方式:

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

cmd1 && ^
cmd2 && ^
cmd3 && ^
cmd4
Run Code Online (Sandbox Code Playgroud)

Bat文件内容(如果要在cmds错误之一时继续批处理)

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4
Run Code Online (Sandbox Code Playgroud)

  • 真正.我这样写的是因为是一个bat文件,大多数你会有多个,可能是长命令,一行中的4个命令在将来的维护中不会很好.可读性是编写优秀程序的关键,因此它们处于不同的界限. (2认同)

Sew*_*zki 8

要从一个脚本执行更多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
Run Code Online (Sandbox Code Playgroud)