你可以在Windows批处理文件中分叉吗?

时间:2013-12-20 07:24:59

标签: batch-file cmd

我想从批处理文件(也是批处理文件)启动两个程序 - 它们将执行几秒钟。然后在主批处理文件中我想等待两个都完成然后继续主执行。这有可能吗?

1 个答案:

答案 0 :(得分:8)

你可以,有点:

@echo off
set Token=MAIN_%RANDOM%_%CD%
start "%Token%_1" cmd /c child1.cmd
start "%Token%_2" cmd /c child2.cmd
:loop
ping -n 2 localhost >nul 2>nul
tasklist /fi "WINDOWTITLE eq %Token%_1" | findstr "cmd" >nul 2>nul && set Child1=1 || set Child1=
tasklist /fi "WINDOWTITLE eq %Token%_2" | findstr "cmd" >nul 2>nul && set Child2=1 || set Child2=
if not defined Child1 if not defined Child2 goto endloop
goto loop
:endloop
echo Both children died.

child1child2刚刚执行pause。这使用或多或少的唯一标记来标识子批处理文件。它们在start的自己的窗口中启动,每个窗口都有一个特定的窗口标题。使用该窗口标题,我们可以使用tasklist再次找到它们,并确定它们是否仍在运行。

弄清楚批处理文件是否仍在运行有点棘手。带有窗口标题过滤器的tasklist会执行它应该执行的操作,但它不会返回合理的错误级别。这就是为什么我们必须通过findstr来获取进程名称(以避免因为选择错误消息而对语言敏感)。