从Windows cmd脚本执行多个命令


136

我正在尝试编写Windows cmd脚本来依次执行多个任务。但是,它总是在脚本中的第一个命令之后停止。

之后停止的命令是Maven构建(不确定是否相关)。

我如何使其继续进行并依次执行每个任务?

安装任何软件或配置注册表等完全是不可能的-恐怕它必须能在普通的Windows XP安装上工作。

理想情况下,如果任何命令失败,我希望脚本中止,但这是一个“不错的选择”,不是必须的。

谢谢。

Answers:


139

当您调用另一个.bat文件时,我认为您需要在调用之前进行“调用”:

call otherCommand.bat

1
嗨,在原始脚本中,我没有调用其他.cmd文件,但此后我将其拆分为单独的文件,以便可以依次运行每个文件。因此,将调用放在每个命令的前面似乎已经成功了,谢谢!
达伦·格雷夫斯

5
实际上,在Windows上,mvn它本身就是.bat文件,因此您需要callcall mvn install;中那样使用它。通常,您不需要创建额外的cmd文件。
jfpoilpret 2012年

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

@Gulzar Nazim-您是否知道我是否可以使用if-else语句将所有命令放在单个批处理文件中,因为我不想在其他批处理文件中维护它?
Ng2-Fun

1
我正在尝试对npm更新和protractor测试执行类似的操作。我没想到应用到我这个答案,直到我意识到npm,并protractor.cmdWindows上的文件。
joshden

45

仅当第一个命令成功执行时,才可以在命令之间使用&&符号来执行第二个命令。更多信息在这里http://commandwindows.com/command1.htm


谢谢,我将结合上面接受的答案进行尝试。
达伦·格雷夫斯

如果maven构建失败,这会停止执行第二个脚本吗?
Varun Achar

该链接断开:“后端服务器未及时响应。应用服务器太忙,无法及时处理请求。”
kevinji 2013年

1
@TheM Windows区分基于GUI的应用程序和基于命令的应用程序(EXE文件开头附近有一个标志)。如果您从命令行启动基于GUI的应用程序,由于它已与命令行完全分离,因此它似乎总是立即结束。如果从GUI程序(例如Explorer)启动基于命令的程序,它将始终显示新的命令行。POSIX系统没有这种区别,因此行为更加一致。
coderforlife 2014年

2
@TheM要解决此问题,您可以使用start /B /WAIT calc
coderforlife 2014年

25

不知道为什么第一个命令会停止。如果可以并行处理,可以尝试类似

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

7
如果您希望命令执行后外壳保持打开状态,请使用/K代替/C
JellicleCat

无需使用cmd.exestart,就start x.bat1可以了。
user66001 2013年

23

我刚刚做了创建批处理脚本以运行Maven测试脚本的完全相同的任务。问题在于,使用mvn clean install调用maven scrips本身就是一个脚本,因此需要通过调用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脚本。


5

仅在第一个命令成功的情况下,使用双“&”号才能运行第二个命令:

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脚本语言更强大的功能。:-(
达伦·格雷夫斯

6
您可以随时使用vbscript或javascript。它们内置在Windows脚本宿主中。
Ferruccio

0

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

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.