打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用批处理+wget做的多任务批量下载。
                            

允许设置最大下载进程数量,自动分配列表中的下载量到每个下载进程,每个地址下载后有记录是否成功下载,将需要下载的文件地址列表放在名为tasksrc.txt文本文件中,格式如下:

使用相对路径,基址需要改后面的批处理代码中的$url_base变量。也可以在这个列表文件中使用绝对地址,但$url_base应该为空。

  1. johnfine/8254ex04.zip  
  2. johnfine/8254ex05.zip  
  3. johnfine/bootf02.zip  
  4. johnfine/bootp02.zip  
  5. johnfine/bootr01.zip  
  6. johnfine/index.htm  
  7. johnfine/jloc.htm  
  8. johnfine/jloc07.zip  
  9. johnfine/pci07.zip  
  10. johnfine/pcopy02.zip  
  11. johnfine/pmcom02.zip  
  12. johnfine/segments.htm  
  13. johnfine/smbmbr03.zip  
  14. johnfine/tasktes1.zip  
  15. johnfine/v86call3.zip  
  16. johnfine/v86test2.zip  
  17. johnfine/vload04.zip  



以下是批处理代码:

  1. :script_begin  
  2.   echo off  
  3.   title multi-task download.  
  4.   setlocal enabledelayedexpansion  
  5.   
  6. ::# 多任务时,允许最大工作者(进程)数量.  
  7.   set $worker_num=10  
  8.     
  9. ::# 每个工作者所分配的任务数量。  
  10.   set $tasks_assign_of_worker_0=1  
  11.   set $tasks_alloc_num=0  
  12.     
  13. ::# 任务总数。  
  14.   set $tasks_count=0  
  15.     
  16. ::# 当前工作者ID。  
  17.   set $current_worker_id=1  
  18.     
  19. ::# 当前工作者所分配的任务数量。  
  20.   set $current_worker_tasks=0  
  21.     
  22. ::# 任务分配源,一个文本文件列出下载地址。  
  23.   set $file_task_source=tasksrc.txt  
  24.     
  25. ::# 下载失败信息的日志文件路径。  
  26.   set $file_task_down_log=err.log  
  27.     
  28. ::# 下载完成信息的日志文件路径。  
  29.   set $file_task_comp_log=comp_stat.log  
  30.     
  31. ::# 下载的文件保存目录。  
  32.   set $folder_output=software  
  33.     
  34. ::# 运行时的临时目录。  
  35.   set $folder_temp=tmp  
  36.   
  37. ::# 任务列表中相对的基地址。  
  38.   set $url_base=http://www.xb312.com/Books/  
  39.   
  40. ::# 判断是否为子程式调用。  
  41.   if "%~1" gtr "0" goto :download  
  42.   
  43. ::# 删除之前的日志文件。  
  44.   if exist "%$file_task_comp_log%" (  
  45.     erase /f /q "%$file_task_comp_log%")  
  46.   if exist "%$file_task_down_log%" (  
  47.     erase /f /q "%$file_task_down_log%")  
  48.       
  49. ::# 计算总共多少个下载地址。  
  50.   if exist "%$file_task_source%" (  
  51.     for /f "delims=:" %%i in (%$file_task_source%) do (  
  52.       set /a $tasks_count=$tasks_count+=1))  
  53.   
  54. ::# 如果下载地址数量为零。  
  55.   if $tasks_count equ 0 goto :error  
  56.   
  57. ::# 删除之前的临时目录。  
  58.   if exist "%$folder_temp%\" (  
  59.     2>&1>nul rmdir /s /q "%$folder_temp%")  
  60.   2>&1>nul mkdir "%$folder_temp%"  
  61.   
  62. ::# 清除工作者ID所分配的任务数量  
  63.   for /f "delims==" %%i in ('set $tasks_assign_of_worker_') do (  
  64.     set %%i=)  
  65.   
  66. ::# 计算每工作者平均任务数量。  
  67.   set /a $tasks_alloc_num=$tasks_count / $worker_num  
  68.   
  69. ::# 为每个工作者设置任务数量。  
  70.   for /l %%i in (1,1,%$worker_num%) do (  
  71.     set /a $tasks_assign_of_worker_%%i=$tasks_alloc_num)  
  72.   
  73. ::# 计算平均数后的剩余的任务数。  
  74.   set /a $tasks_alloc_num=$tasks_count %% $worker_num  
  75.   
  76. ::# 将剩余任务分配给各工作者。  
  77.   for /l %%i in (1,1,%$tasks_alloc_num%) do (  
  78.     set /a $tasks_assign_of_worker_%%i+=1)  
  79.   
  80.   set $tasks_alloc_num=0  
  81.   set $current_worker_id=1  
  82.   call set $current_worker_tasks=%%$tasks_assign_of_worker_%$current_worker_id%%%  
  83.   
  84. ::# 根据每工作者所分的任务数量进行下载地址分配。  
  85.   for /f "delims==" %%i in (%$file_task_source%) do (  
  86.     echo.%%~i>>"%$folder_temp%\task_list!$current_worker_id!.txt"  
  87.     set /a $current_worker_tasks-=1  
  88.     if !$current_worker_tasks! equ 0 (  
  89.       set /a $current_worker_id+=1  
  90.       call set $current_worker_tasks=%%$tasks_assign_of_worker_!$current_worker_id!%%))  
  91.   
  92. ::# 启动每个工作者。  
  93.   for /l %%i in (1,1,%$worker_num%) do (  
  94.       start /MIN cmd.exe /c call "%~0" %%i )  
  95.   
  96.   goto :script_exit  
  97.   
  98. :error  
  99.   echo. no tasks.  
  100.   
  101. :script_exit  
  102.   goto :eof  
  103.   
  104. :download  
  105.   set $down_count=0  
  106.   
  107. ::# 获得当前工作者分配的总任务数量。    
  108.   call set $current_worker_tasks=%%$tasks_assign_of_worker_%~1%%  
  109.     
  110. ::# 从地址列表中按顺序下载每个文件。  
  111.   if exist "%$folder_temp%\task_list%~1.txt" (  
  112.     for /f "delims=:" %%i in (%$folder_temp%\task_list%~1.txt) do (  
  113.       2>&1>nul wget -nc -t 3 -P "%$folder_output%" %$url_base%"%%~i" && (  
  114.         echo. PASS ===^> %%~i>>%$file_task_down_log%) || (  
  115.         echo. FAIL ===^> %%~i>>%$file_task_down_log%)  
  116.       set /a $down_count+=1  
  117.       title !$down_count! of %$current_worker_tasks%)  
  118.     erase /f /q %$folder_temp%\task_list%~1.txt)  
  119.   
  120. ::# 下载完成后记录到日志。  
  121.   echo. task %~1 completed.>>%$file_task_comp_log%  
  122.   
  123. ::# 如果全部下载完成,删除临时目录。  
  124.   set $remains_files=0  
  125.   for %%i in (%$folder_temp%\*.*) do (  
  126.     set /a $remains_files+=1)  
  127.   
  128.   if %$remains_files% equ 0 (  
  129.     rmdir /s /q %$folder_temp%)  
  130.       


 

  1. <p>  
  2. </p>  

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
线程池的原理及实现
【Swoole系列2.5】异步任务
Flink资料(1)
RabbitMQ tutorial - 工作队列
Routine Load | Apache Doris
1分钟实现“延迟消息”功能
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服