在Windows cmd脚本中执行多个命令

141

我正在尝试编写一个 Windows cmd 脚本以便串行执行多个任务。

然而,它总是在第一个命令后停止运行。

它停止后的命令是一个 maven 构建(不确定这是否相关)。

请问如何让脚本继续运行并按顺序运行每个任务?

安装任何软件或配置注册表等都完全不可能——很抱歉,它必须在原始的 Windows XP 安装上运行。

理想情况下,如果任何一个命令失败,脚本会中止,但这只是“好有的”而非必要条件。

谢谢。


你可能正在尝试启动一个批处理文件。请检查此链接 -> https://dev59.com/z3NA5IYBdhLWcg3wEZeT#64720570 - npocmaka
8个回答

142
当您调用另一个.bat文件时,我认为您需要在call前面添加"call":
call otherCommand.bat

1
嗨,在原始脚本中,我没有调用其他的.cmd文件,但是现在我把它们分成了单独的文件,以便能够逐个运行每个文件。 因此,在每个命令前面加上调用似乎就解决了问题,谢谢! - Darren Greaves
6
事实上,在Windows上,mvn本身就是一个.bat文件,因此您需要像这样使用call mvn install中的call; 通常情况下,您不需要创建额外的cmd文件。 - jfpoilpret
2
请注意,批处理文件中不需要分号。使用call的原因是mvn本身是一个批处理文件,并且批处理文件需要使用call来相互调用,否则控制权将不会返回给调用方。 - Pushkar
@Gulzar Nazim - 你知道我是否可以将所有命令放在一个带有if-else语句的批处理文件中,因为我不想在不同的批处理文件中维护它吗? - Ng2-Fun
这里的讽刺是答案指向问题相反的方向,但仍然获得了120个赞。 - Giridhar Karnik
1
我曾试图使用npm更新和protractor测试来做类似的事情。一开始我认为这个答案与我无关,直到我意识到在Windows上,npmprotractor都是.cmd文件。 - joshden

45

谢谢,我会尝试结合上面被接受的答案来实现。 - Darren Greaves
如果Maven构建失败,这会停止第二个脚本的执行吗? - Varun Achar
该链接已损坏:“后端服务器未能及时响应。应用服务器过于繁忙,无法及时处理请求。” - Kevin Ji
1
@TheM Windows区分GUI程序和命令行程序(在EXE文件的开头附近有一个标志)。如果你从命令行启动GUI程序,它似乎总是立即结束,因为它完全与命令行分离。如果你从GUI程序(如资源管理器)启动命令行程序,它将始终显示一个新的命令行。POSIX系统没有这样的区别,因此行为更加一致。 - coderforlife
2
@TheM 为了解决这个问题,您可以使用 start /B /WAIT calc - coderforlife
显示剩余2条评论

25

不确定为什么第一个命令会停止。 如果您可以并行执行它,可以尝试类似的操作。

start cmd.exe /C 1.bat      
start cmd.exe /C 2.bat

7
如果想要在命令执行后保持 shell 打开状态,应使用 /K 而不是 /C - JellicleCat
不需要使用 cmd.exestart,只需使用 start x.bat1 即可。 - user66001

23

我刚完成了一个类似的任务,创建一个批处理脚本来运行maven测试脚本。问题在于使用mvn clean install ...调用maven脚本本身就是一个脚本,因此需要使用call mvn clean install。

以下是有效的代码

rem run a maven clean install
cd C:\rbe-ui-test-suite 
call mvn clean install
rem now run through all the test scripts
call mvn clean install -Prun-integration-tests -Dpattern=tc-login
call mvn clean install -Prun-integration-tests -Dpattern=login-1
注意使用call命令。这会允许在批处理文件中使用连续的Maven脚本。

6

使用双拼音符号(&&)将只在第一个命令成功时运行第二个命令:

cd Desktop/project-directory && atom .

如果只使用一个“&”符号,将尝试运行两个命令,即使第一个命令失败:

cd Desktop/project-directory & atom .

1
如果你在Windows操作系统中运行,你可以使用以下命令:

驱动器:

cd "Script location"
schtasks /run /tn "TASK1"
schtasks /run /tn "TASK2"
schtasks /run /tn "TASK3"
exit

1

我不知道直接回答你的问题,但如果你经常编写这些脚本,学习一个更强大的语言比如Perl可能是值得的。Windows有免费的实现(例如Activestate、Cygwin)。我发现为了自己的任务而付出最初的努力是值得的。

编辑:

正如@Ferruccio所建议的,如果你不能安装额外的软件,考虑使用VBScript和/或JavaScript。它们内置于Windows脚本宿主程序中。


谢谢,但我不能安装任何软件。 我希望我能访问比烂的Windows脚本语言更强大的东西。 :-( - Darren Greaves
6
你可以随时使用VBScript或JavaScript,它们已经内置于Windows脚本宿主中。 - Ferruccio

0
请注意,在批处理文件中不需要使用分号。而您需要使用call的原因是mvn本身就是一个批处理文件,批处理文件需要使用call相互调用,否则控制权不会返回给调用者。

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