限制 FOR 循环启动的批处理文件数

Limit number of batch files launched by FOR loop

我有一个批处理文件,可以下载 21 个单独的文件(都非常大)。我有超时尝试让一些文件在尝试获取更多文件之前完成(不是一个好的解决方案),如果它们全部 运行 在一起,它会使用我所有的系统资源并且一切都会停止。

我可以将 /WAIT 放在我的 FOR 循环中,然后它一次只会启动一个下载任务。我想启动 5 个下载 windows,完成后,继续下 5 个。我尝试使用 GOTO 等待完成,但它不起作用。

rem *****Step 1*****
set tstart=0
set tend=5
set incr=1
FOR /L %%a IN (%tstart%,%incr%,%tend%) DO (start /ABOVENORMAL GET_PIECE_ENSEMBLE.bat %newformatdate% 0%%a %HH%)
timeout /t 30

:WAIT
if exist flagfile.* goto WAIT

然后我还有 4 个步骤来下载文件 5-10、11-16 等。但是如果下载需要额外的时间,脚本会继续并开始下载更多文件或继续下一个过程,这需要首先下载所有数据。我在这里尝试了两件事:确保数据已经开始下载的短暂超时(因此存在标志文件),如果存在标志文件则等待。但是等待不起作用,脚本仍在继续并开始下载下一批。我的解决方法是将超时设置为 600,但有时下载数据需要超过 10 分钟,有时会挂起并花费长达两个小时,有时只需要几分钟。如果所有部件同时启动,它会冻结工作站,我们必须重新启动机器。

这里是 GET_PIECE_ENSEMBLE 的代码,运行 在 FOR 循环中的脚本:

set "newformatdate=%1"
set "ename=%2"
set "HH=%3"
echo %time% > flagfile.%ename%
wget -O C:/Data/DataFile_%HH%.%ename%.grb2 http://url/%newformatdate%.grib2
del flagfile.%ename%

正在寻找有关如何使 "wait if flagfile exists" 工作的建议(知道为什么这不起作用吗?),或者如果有一些简单的参数我可以放入我的 FOR 循环中以限制数量的实例,以便下载在其他人开始之前完成?当网络条件变化如此之大时,肯定有比猜测超时间隔更好的解决方案!

在GET_PIECE_ENSEMBLE

尝试

...
set "HH=%3"
:only5
set /a running=0
for /f %%c in ('dir /b/a-d flagfile.* 2^>nul') do set /a running+=1
if %running% geq 5 (
 timeout /t 1 >nul
 goto only5
)
echo %time% > flagfile.%ename%
...

这应该计算标志文件,当有 5 个或更多时,延迟 1 秒。

一旦删除了一个标志文件,下一个要激活的排队文件就会将进程中文件的数量再次增加到 5,从而阻塞其他排队进程。

未经测试!!!

:: Start with list of files to download as parameters
:: down.cmd "file1" "file2" "file3" etc.. 
@echo off
set "url=http://host.com"
:loop
for /f %%a in ('tasklist /FI "imagename eq wget.exe" /FI "windowtitle eq _download*" /FO csv /NH ^| find /C "wget"') do (
if %%a LEQ 5 (
            start "_download" "%path%\wget.exe" -O "%~1" "%url%/%~1"
            shift
            )
timeout /T 5
if not "%~1"=="" goto loop