【问题标题】:Windows batch: run a process in background and wait for itWindows批处理:在后台运行一个进程并等待它
【发布时间】:2013-02-07 09:43:17
【问题描述】:

我需要从批处理作业中启动 2 个后台进程,然后等待它们。 Unix shell 类比是:

myprocess1 -flags1 &
pid1=$!

myprocess2 -flags2 &
pid2=$!

wait ${pid1}
wait ${pid2}

有什么想法吗?

【问题讨论】:

  • 有一个想法为 Windows 或类似的东西安装 bash(我确信至少有一个本地的、非 cygwin 端口的 zsh)。我很想为许多批处理文件问题推荐相同的东西,但对于这个问题,它可能是一个很好的答案。
  • @AntonKovalenko 谢谢。我正在考虑这个。

标签: windows batch-file windows-shell


【解决方案1】:

您可以使用启动包装器来解决它。

包装器使用start /wait 启动一个进程,并在该进程完成后删除一个用于发送信号的文件。

第一个进程通过包装器启动,第二个进程可以从 start /wait 启动。
那么你只需要等待文件。

Echo > waiting.tmp 
Start cmd /c wrapper.bat myprocess1 -flags1
start /wait myprocess2 -flags2

:loop
if exist waiting.tmp goto :loop

wrapper.bat 的内容

start /wait %*
del waiting.tmp

【讨论】:

  • +1 - 您可以反转逻辑并从“waiting.tmp”开始,并通过删除文件发出完成信号。主脚本中少了一行代码:-)
  • 谢谢戴夫,我把它改成了你的聪明建议
  • 如果使用我的建议,那么wrapper.bat必须删除.tmp文件,我认为.tmp文件应该重命名为“waiting.tmp”。另外,我刚刚注意到包装器不应该使用/wait 选项。
【解决方案2】:

使用START 命令:

START /WAIT myprocess1 -flags1

唯一的问题是 AFAIK 你不能让进程并行运行并等待它们——它们必须按顺序运行。

您可以通过在没有START /WAIT 的情况下启动两个进程来实现并发,然后定期解析TASKLIST 命令的输出以查看它们是否仍在运行。这将变得更加复杂,当然这是一个忙碌的等待,但理论上会允许进程同时运行。

【讨论】:

  • 我真的需要并行运行这些进程。如果可能的话,我也想避免解析。
猜你喜欢
  • 1970-01-01
  • 2016-08-31
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
相关资源
最近更新 更多