按顺序运行批处理文件

15

我想请教大家如何在Windows中顺序运行批处理文件。

我已经尝试过:

start /w batchfile_1.bat 
start /w batchfile_2.bat
..
start /w batchfile_n.bat

但是在继续执行下一个.bat文件之前,我必须手动关闭先前的.bat文件进程(例如通过点击)。 有没有自动化解决方案可以避免我每次都要手动关闭先前的.bat程序?

非常感谢。


你尝试过不使用start /w简单运行它们吗?虽然有一段时间了,但它们应该按顺序运行,等待彼此完成,并且不会打开需要用户输入等的新窗口。 - Brad
我会查看这个问题的解决方案:在Windows命令行环境中运行多个批处理文件 - Ishikawa
@Brad:是的,如果没有使用start /w或者只使用start,.bat文件将会同时运行,而不是我想要的顺序运行。我也尝试了call,但它同样会让多个.bat文件同时运行。 - user1634603
@user1634603,不要使用startcall,尝试一下。 - Brad
没有仔细阅读评论就轻率地投了一张关闭票。抱歉。 - Andriy M
3个回答

23

我会查看这个问题的解决方案:运行多个批处理文件

  • 取自链接中的答案。

使用call命令:

call bat1.cmd
call bat2.cmd

默认情况下,当您仅从另一个批处理文件中运行批处理文件时,控制权不会返回给调用方。这就是为什么需要使用call的原因。

基本上,如果您有这样的批处理:

@echo off
echo Foo
batch2.cmd
echo Bar

那么它只会输出

Foo
如果你按照这样写
@echo off
echo Foo
call batch2.cmd
echo Bar

然而,它将输出

Foo
Bar

因为在batch2终止后,程序控制权会回到您的原始批处理文件。


最好的方法是让第一个批处理文件以执行(而不是“调用”)第二个文件结束,第二个文件执行第三个文件,以此类推。如果您希望它们保证按顺序运行,则这是唯一可以保证实现的方法;如果其中一个崩溃,它将不会调用下一个文件,执行链将被中断。 - Ken White
1
但如果操作者(或其他人)以后想要更改或添加批处理文件的顺序,会发生什么呢?这种方式不是更容易吗?所有批处理文件都从一个主文件运行。 - Ishikawa
问题在于 call 命令可能会出现这样一种情况:当序列中的某个文件出现问题而提前退出时,后续文件仍将在控制返回到“主文件”时执行。你无法保证严格按顺序执行该序列。(不是贬低你的回答,只是发表评论。) - Ken White
啊,我明白了。我也比较新手,所以没有考虑到这一点。我想如果批处理文件的顺序不是非常关键,只需要同时运行,那么这个方法应该是可行的。感谢您的建议。 - Ishikawa
请Ishikawa、Ken White或James K发布一个完整、准确的逐字逐句、字符对字符的测试、验证并且最重要的是可行的.BAT文件示例,如果这三位先生不在了,是否有其他人可以回答?谢谢! - Michel Merlin
显示剩余5条评论

3

如果你喜欢使用START命令,你可以在批处理文件结束时添加EXIT命令。这将关闭start命令创建的窗口。

@echo off
 .
 .
:: Inspired coding
 .
 .
exit

1
顺便说一下,不要在你启动的批处理文件中使用 EXIT /b。它不会关闭窗口,并且旨在将错误级别传递回调用文件。这是不可能的,因为你使用 START 启动了一个单独的 cmd.exe 环境。 - James K
谢谢你的建议。然而,使用exit命令确实会关闭我启动.bat时出现的窗口,但进程变成同时执行,而不是我想要的顺序执行。 - user1634603

0

根据您的评论,我不确定但以下似乎是在运行该序列的START命令时发生的情况:

  1. 调用START /W命令并启动批处理文件。

  2. 批处理文件开始执行并运行程序。

  3. 批处理文件完成,其控制台窗口保持打开状态,但程序继续运行。

  4. 因为控制台窗口仍然保持打开状态,所以使用START /W命令仍在执行。

  5. 等待程序终止,然后关闭控制台窗口,接着调用下一个START /W命令,重复以上步骤。

现在,如果您在要顺序运行的每个批处理文件的末尾放置EXIT,那么情况会更糟,因为它会导致批处理脚本完成后关闭控制台窗口,这反过来会结束相应的START /W命令并导致另一个命令执行,即使批处理脚本调用的程序仍在运行。因此,效果是批处理脚本(或者说由它们执行的程序)同时运行而不是顺序运行。

我认为,如果这个问题可以解决的话,你需要将 START /W 命令移动并放置在每个批处理文件中,在该批处理文件执行并且不等待终止的每个命令之前。也就是说,如果你的 batchfile_1.bat 运行一个 program.exe,则将命令行更改为 START /W program.exe,其他批处理文件中的相关命令同理。

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