同时执行多个batch file并监视其处理是否完成

我有一个调用多个batch file的主batch file。 我希望能够同时执行所有这些batch file。 一旦完成,我就有了需要在主要匹配文件中进行的进一步处理。

当我使用“开始”调用多个batch file时,能够同时启动所有batch file,但是我失去了跟踪处理能力。 (主批文件认为他们的进程在执行其他批文件的那一刻就完成了)。

当我使用“调用”时,能够监视batch file进程,但它会顺序而不是同时启动batch file。

有没有解决的办法? 在这台PC上拥有有限的权限,并试图仅使用批处理来完成此操作。

主batch file

call first.bat call second.bat call third.bat :: echo only after all batch process done echo done! 

first.bat

 timeout /t 10 

second.bat

 timeout /t 10 

third.bat

 timeout /t 10 

这是解决这个问题的最简单和最有效的方法:

 ( start first.bat start second.bat start third.bat ) | pause echo done! 

在这个方法中,主文件中的等待状态是事件驱动的 ,所以它不消耗任何CPU时间。 当( block )中的任何命令输出一个字符时, pause命令将会终止,但在此cmd.exe中start命令不会显示任何输出。 这样, pause一直等待一个字符,直到start命令启动的所有进程结束。 此时与( block )关联的管道关闭,所以pause Stdin被关闭,命令由cmd.exe终止。

这将生成一个临时文件并通过创建一个重定向来锁定它,启动这个重定向中的批次子进程。 当所有子流程结束时,重定向关闭,临时文件被删除。

当子进程正在运行时,文件被锁定,我们可以测试这个尝试重命名文件。 如果我们可以重命名文件,子进程已经结束,否则一些进程仍在运行。

 @echo off setlocal enableextensions disabledelayedexpansion for %%t in ("%temp%\%~nx0.%random%%random%%random%.tmp") do ( echo Starting subprocesses 9> "%%~ft" ( start "" cmd /c subprocess.bat start "" cmd /c subprocess.bat start "" cmd /c subprocess.bat start "" cmd /c subprocess.bat start "" cmd /c subprocess.bat ) echo Waiting for subprocesses to end break | >nul 2>nul ( for /l %%a in (0) do @(ren "%%~ft" "%%~nxt" && exit || ping -n 2 "") ) echo Done ) & del "%%~ft" 

注意 :子进程内部启动的任何进程也将保存重定向和锁定。 如果你的代码留下了一些东西在运行,就不能使用。

 @ECHO Off SETLOCAL :: set batchnames to run SET "batches=first second third" :: make a tempdir :maketemp SET /a tempnum=%random% SET "tempdir=%temp%\%tempnum%" IF EXIST "%tempdir%*" (GOTO maketemp) ELSE (MD "%tempdir%") FOR %%a IN (%batches%) DO START "%%a" %%a "%tempdir%\%%a" :wait timeout /t 1 >nul FOR %%a IN (%batches%) DO IF exist "%tempdir%\%%a" GOTO wait RD "%tempdir%" /S /Q GOTO :EOF 

批量构建的地方

 @ECHO OFF :: just delay for 5..14 seconds after creating a file "%1", then delete it and exit SETLOCAL ECHO.>"%~1" SET /a timeout=5+(%RANDOM% %% 10) timeout /t %timeout% >NUL DEL /F /Q "%~1" EXIT 

也就是说,每个被调用的批处理首先在临时目录中创建一个文件,然后在所需的进程运行后将其删除。 创建/删除的文件名作为批处理的第一个参数提供,并且由于temp目录名通常包含分隔符而被“引用”。

主线只创建一个临时目录并调用子过程,然后重复等待1秒,检查子过程的标志文件是否全部被删除。 只有当它们全部被删除后才能继续删除临时目录