如何在完成第一次设置后并行运行三个批处理文件并运行另外三个批处理文件?

时间:2017-01-11 06:39:14

标签: batch-file

我有大约24个批处理文件,我必须一次运行3个文件,然后在完成第3个文件后,我将运行下3个文件,依此类推。

假设我有像.bat,2.bat,3.bat等文件,我需要它们在完成前3个文件时先运行3个我需要运行的3个文件,依此类推,直到所有24个文件。< / p>

3 个答案:

答案 0 :(得分:1)

此解决方案使用this answer

中描述的方法
@echo off
setlocal EnableDelayedExpansion

for /L %%i in (1,3,22) do (
   set /A N1=%%i, N2=%%i+1, N3=%%i+2
   ( start "" !N1!.bat & start "" !N2!.bat & start "" !N3!.bat ) | set /P "="
)

在此方法中,第一个线程进入等待状态,在三个已启动的批处理文件结束之前不会占用CPU。它也很容易编写(看起来很棒!;)

答案 1 :(得分:0)

start 1.bat
start 2.bat
start /wait 3.bat
start 4.bat
start 5.bat
start /wait 6.bat

等等。这假定具有/wait开关的批处理文件是最长的批处理文件。如果不可能,您可以在此处使用此脚本:

@echo off

start bat1.bat
start bat2.bat
start bat3.bat
call waitForFinish
start bat4.bat
start bat5.bat
start bat6.bat
call waitForFinish
Goto:eof

:waitForFinish
set counter=0
for /f %%i in ('tasklist /NH /FI "Imagename eq cmd.exe') do set /a counter=counter+1
if counter GTR 2 Goto waitForFinish

启动3个批处理文件后,您可以调用“函数”waitForFinish。这将检查它是否找到多个正在运行的命令行进程(一个用于运行的批处理文件,因此它将始终存在,另一行在输出之上)并为它找到的每个窗口计数。 /> 如果该计数器大于2,它将一次又一次地执行相同操作,直到只有正在运行的批处理文件窗口是找到的唯一cmd.exe进程。如果是这种情况,脚本将返回脚本的顶部以开始接下来的三个。

答案 2 :(得分:0)

以下脚本如何并行执行三个批处理文件并等待它们完成?基本上,它允许每个批处理文件将其 STDERR 输出重定向到临时文件,只要批处理文件仍在运行,该文件就会被写入锁定。批处理文件一旦终止,就可以访问临时文件进行写入,因此可以删除它。所以这是代码:

@echo off

rem /* Execute three batch files in parallel, redirect their STDERR output
rem    into individual temporary files: */
start "" cmd /C 2^> "1.tmp" "1.bat"
start "" cmd /C 2^> "2.tmp" "2.bat"
start "" cmd /C 2^> "3.tmp" "3.bat"

rem // Call sub-routine containing a polling loop:
call :POLL "1.tmp" "2.tmp" "3.tmp"

exit /B


:POLL  {val_temp_file}*
rem /* Establish polling loop that tries to delete the temporary files;
rem    if a batch file is still running, the respective temporary file
rem    is not yet accessible, so deletion fails: */
:LOOP
rem // Delay execution to give processor some time:
> nul timeout /T 1 /NOBREAK
rem /* `for /F` loop to capture the STDERR output of the `del` command;
rem    remember that `del` does not set the `ErrorLevel` unfortunately: */
for /F "delims=" %%E in ('
    rem/ Discard STDOUT output and redirect STDERR output adequately: ^& ^
    2^>^&1 ^> nul ^(^
        rem/ `if exist` even works for already opened/accessed files: ^& ^
        for %%F in ^(%*^) do if exist "%%~F" del "%%~F"^
    ^)
') do (
    rem // Loop iterates, so there is STDERR output, hence loop back:
    goto :LOOP
)

exit /B