【问题标题】:Wait For Commands to Finish等待命令完成
【发布时间】:2011-10-20 06:22:16
【问题描述】:

我有一个启动其他批处理文件的 Windows 批处理文件。在第一批中执行某事之前,如何等待所有其他批处理文件完成?我不能使用 /wait,因为我需要并行运行其他命令。

【问题讨论】:

  • 你能发布一些代码吗?我不清楚你的问题是什么。
  • 您是否使用call ... 启动其他批次?

标签: windows batch-file command dos


【解决方案1】:

您可以使用多个标志文件,每个运行批处理文件一个。例如:

第一个批处理文件进入时创建Flagfile.1,结束前删除,其余并发批处理文件(Flagfile.2,...)同理

主文件必须等待所有标志文件消失。例如,在主文件中:

start Batch1
start Batch2
.....
:wait
if exist flagfile.* goto wait

在任何批处理文件中,例如 Batch1:

echo %time% > flagfile.1
echo Do my process...
del flagfile.1
exit

【讨论】:

  • @woohoo:对不起,我认为这里有一个混乱。问题是关于如何等待所有子并行批处理结束,然后再继续父批处理。没有办法通过 CALL 解决这个问题,而是通过 START。正如提问者所说,他不能使用 /WAIT,这是 START 命令的一个选项。解决方案是实现一个信号量系统,允许父批处理文件知道其所有子文件何时结束。我提出了一个基于文件存在的非常简单的信号量系统,但是,它应该可以完美地工作。那么,为什么我的回答遭到了反对? :-(
  • +1,为什么确实投反对票,特别是因为这是唯一真正解决问题的答案。最好让主文件创建标志文件。主脚本可能在子进程完成初始化之前开始测试。
  • 喜欢这个!在 VS 中,我们一直在每个服务项目的构建后事件中使用 CALL 来下载每个服务项目的 *.cs 参考文件以存储在另一个项目中,该文件包含一个简单的程序集参考。我刚刚遇到START /b /i,发现我可以同时运行它们,同一个窗口,不会相互影响。如此甜蜜。然后,我想在他们都完成构建该服务项目之后我怎么能使用MSBuild,以便自动更新引用其程序集的项目。轰隆隆!
【解决方案2】:

我的建议是使用CALL 命令。来自Batch Files的例子:

Batch1.bat 列表:

REM Batch1.bat
SET ABC=1
CALL BATCH2.BAT %ABC%
ECHO ABC = %ABC%
BATCH2.BAT %ABC%
ECHO ABC = %ABC%

Batch2.bat 列表在哪里:

REM Batch2.bat
SET ABC=%ABC%%1


编辑: 根据@Andriy M 的反馈,以下是两个批次的改进版本:

第 1 批:

@ECHO OFF
REM Batch1.bat
SET ABC=1
CALL batch2.bat %ABC%
ECHO 1. ABC = %ABC%
CALL batch2.bat %ABC% REM test this line with CALL and without
ECHO 2. ABC = %ABC%

第 2 批:

@ECHO OFF
REM Batch2.bat
SET tmout=5
echo sleeping %tmout% seconds...
REM this introduces a timeout by using a nonexistent ip address
PING 1.2.1.2 -n 1 -w %tmout%000 > NUL
echo done sleeping
SET ABC=%ABC%%1

查看 batch1 中我写评论的那一行用 CALL 和不用 CALL 测试这一行。运行该批次两次,该行包含CALL 和不包含CALL

控制台的输出没有 CALL:

C:\temp>batch1.bat
sleeping 5 seconds...
done sleeping
1. ABC = 11
sleeping 5 seconds...
done sleeping

现在控制台的输出 with CALL:

C:\temp>batch1.bat
sleeping 5 seconds...
done sleeping
1. ABC = 11
sleeping 5 seconds...
done sleeping
2. ABC = 1111

请注意区别:我们得到第二个回声,q.e.d.

【讨论】:

  • 也就是说,没有 CALL 的情况下,它的等待与使用 CALL 的情况一样,但只是……终止。 :)
  • @Andriy M:根据我目前的经验,不是所以,如果没有 CALL - 执行立即返回到下一行,无需等待被调用批处理/命令完成(也许您应该尝试长时间操作)。
  • 这太奇怪了,我不得不使用您的示例脚本来验证我的期望。我在我的 Windows 7 SP1 中从命令提示符运行了第一批,这两个脚本就像我想象的那样为我工作,即在第二次调用时batch2.bat 终止后执行终止。也就是说,batch1.bat 的最后一行没有执行。您对它们进行了哪些测试,您说没有 CALL 执行将返回到第一批,并且也无需等待?
  • 如果一个 Batch 文件在没有 CALL 的情况下运行另一个文件,净效果相当于“转到另一个文件”:当第二个文件结束时,整个执行结束。我将这种方式执行的批处理文件称为“叠加”。
  • -1,这个“解决方案”完全无视OP希望一个批处理脚本并行启动多个子脚本,并等待它们完成。
猜你喜欢
  • 1970-01-01
  • 2013-04-03
  • 2015-06-13
  • 1970-01-01
  • 2011-09-20
  • 2016-01-29
  • 2012-10-16
  • 2014-09-08
  • 2023-04-04
相关资源
最近更新 更多