Windows 批处理脚本的 bash“等待”替代方案

Windows 批处理脚本的 bash“等待”替代方案

在 bash 中,有一个选项可以使用wait命令等待当前 shell 启动的所有后台进程。

例如

#!/bin/bash
{ sleep 5; echo "waking up after 5 seconds"; } &
{ sleep 1; echo "waking up after 1 second"; } &
wait
echo all jobs are done!

我如何在 Windows 批处理脚本中执行相同操作?我必须在后台运行多个命令并等到所有命令完成。

答案1

您可能希望 START 命令启动并行处理,尽管可以通过 WMIC 完成。请注意,如果第一个参数被引号括起来,它将被视为窗口标题。这就是为什么我的第一个参数是空字符串。该/B选项在同一窗口中运行命令。如果您希望每个命令都有一个新窗口,请将其删除。

没有简单的本机批处理命令或选项来等待一系列并行过程完成。

我喜欢将未使用的文件句柄重定向到每个进程的文件,从而建立独占锁定。然后,我可以通过尝试重定向(CALL )(实际上是一个空操作)到同一个锁定文件来检测进程是否仍在运行。如果重定向失败,则进程仍在运行。成功表示进程已终止。

必须针对轮询循环中的每个锁定文件进行测试。添加延迟是一个好主意,可以防止轮询循环滥用资源。

@echo off
set "lock=%temp%\%~nx0.lock"
start "" /b "timeout" 5 9>"%lock%.1"
start "" /b "timeout" 8 9>"%lock%.2"
:wait
timeout 1 /nobreak >nul
2>nul (for %%F in ("%lock%.*") do 9>"%%F" (call ) && del "%%F" || goto :wait)
echo OK

如果您有大量并行进程需要运行,并且想要限制同时运行的进程数,那么您可能会对https://stackoverflow.com/a/11715437/1012053

相关内容