【问题标题】:Run batch files sequentially按顺序运行批处理文件
【发布时间】:2012-08-29 23:33:15
【问题描述】:

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

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

但我必须手动关闭前一个 .bat 文件进程(例如通过单击),然后才能继续下一个进程。 是否有任何解决方案可以自动执行此操作,而无需我每次都手动关闭以前的 .bat 程序?

非常感谢。

【问题讨论】:

  • 您是否尝试过在没有start /w 的情况下简单地运行它们?已经有一段时间了,但它们应该按顺序运行,等待对方完成,而不是在新窗口中打开等需要用户输入的情况。
  • 我会检查这个问题的解决方案:Run Multiple batch files
  • @Brad:是的,如果没有 start /w,或者只使用 start,.bat 文件将同时运行,而不是按我想要的顺序运行。我也使用过调用,但它也使多个 .bat 文件同时运行。
  • @user1634603,不,尝试不使用startcall
  • 愚蠢地投了票,没有更多地关注 cmets。对不起。

标签: batch-file sequential


【解决方案1】:

我会检查这个问题的解决方案:Run Multiple batch files

  • 摘自链接中的答案。

使用调用:

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 终止后,程序控制权被传递回您原来的批处理文件。

【讨论】:

  • 通过执行(不是calling)第二个批处理文件结束第一个批处理文件更容易,第二个执行第三个,依此类推。如果您希望它们保证按顺序运行,这是唯一可以这样做的方法;如果一个崩溃,它不会调用下一个并且执行链将被破坏。
  • 但是如果 OP(或其他任何人)想要稍后更改或添加批处理文件的顺序会发生什么。这种方式不是更容易吗?所有批处理文件都从一个主文件运行在哪里?
  • 问题在于call 序列中的一个文件可能存在问题,使其提前退出,并且当控制权返回“主文件”时,后续文件仍将执行”。您不能保证序列严格按顺序执行。 (不反对你的答案,只是评论。)
  • 啊,我明白了,我对此也很陌生,所以我没有考虑过。我想如果批处理文件顺序不是很重要但只需要同时运行,这将起作用。感谢您的意见。
  • @KenWhite "call 的问题..." 如果您使用 EXIT /b 并在运行下一个文件之前检查错误代码是否为 0,则不会。
【解决方案2】:

如果您喜欢使用START,您可以让您的批处理文件以EXIT 命令结尾。这将关闭由start 命令创建的窗口。

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

【讨论】:

  • 顺便说一句,不要将EXIT /b 与您STARTed 的批处理文件一起使用。它不会关闭窗口,并且旨在将错误级别传递回调用文件。这是不可能的,因为您使用 START 启动了单独的 cmd.exe 环境。
  • 感谢您的建议。但是,使用 exit 命令确实关闭了我启动 .bat 时出现的窗口,但是该过程会同时执行,而不是按我想要的顺序执行。
【解决方案3】:

我不确定,但根据您的 cmets,当您运行 START 命令序列时,似乎会发生以下情况:

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

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

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

  4. 用于运行批处理文件的START /W 命令仍在执行,因为控制台窗口保持打开状态。

  5. 等待程序终止,然后关闭控制台窗口,然后调用下一个START /W 命令,一切都在重复。

现在,如果您将EXIT 放在要按顺序运行的每个批处理文件的末尾,这会使情况变得更糟,因为它会导致控制台窗口在批处理脚本完成后关闭,进而结束相应的@ 987654326@ 命令并导致另一个执行,即使批处理脚本调用的程序可能仍在运行。所以效果是批处理脚本(或者,更确切地说,由它们执行的程序)同时运行而不是顺序运行。

我认为,如果可以完全解决这个问题,您需要移动 START /W 命令并将其放在该批处理文件执行且不等待终止的(每个)命令前面的每个批处理文件中的。也就是说,如果您的batchfile_1.bat 运行program.exe,请将命令行更改为START /W program.exe,对于其他批处理文件中的其他相关命令也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    相关资源
    最近更新 更多