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

时间:2016-10-24 02:47:25

标签: windows batch-file cmd wget

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

我可以在我的FOR循环中放置/ WAIT,然后它一次只能启动一个下载任务。我想推出5个下载窗口,一旦完成,继续下一个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等。但是如果下载需要很长时间,脚本会继续下载并开始下载更多文件或转移到下一个需要处理的文件首先要下载的所有数据。我在这里尝试两件事:确保数据已开始下载的短暂超时(因此存在标志文件),以及等待if flagfile存在。但是等待不起作用,脚本仍然继续运行并开始下载下一批。我的解决方法是将超时设置为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%

寻找有关如何制作"等待标志文件存在的建议"工作(任何想法为什么这不工作?),或者如果有一些简单的参数我可以放入我的FOR循环来限制实例数量,以便下载完成之前其他人开始?当网络状况变化太大时,当然有一个比在超时间隔猜测更好的解决方案!

2 个答案:

答案 0 :(得分:0)

在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,从而阻止其他排队进程。

答案 1 :(得分:0)

UNTESTED !!!

:: 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