使用 aria2 高效下载文件的实践技巧

在日常工作或自动化任务中,我们经常需要从网络上批量下载软件安装包、数据文件或工具更新程序。相比传统浏览器手动点击下载,命令行工具能够提供更高的灵活性和效率。

本文将介绍一款轻量级但功能强大的命令行下载工具 aria2,并通过多个实用的批处理示例说明如何使用它完成各种下载任务。


一、aria2 简介

aria2 是一个跨平台的命令行下载工具,支持 HTTP/HTTPS、FTP、BitTorrent、Metalink 等协议。它体积小巧但功能强大,具备多线程下载、断点续传、下载限速、自定义请求头等特性,非常适合在批处理脚本或自动化流程中使用。


二、aria2 下载示例(以 WinRAR 安装包为例)

以下为一些典型的使用场景,均可直接写入 .bat 批处理文件中运行。

1. 切换到指定目录

cd /d E:\test

将当前工作目录切换至 E:\test,用于保存下载的文件。


2. 基础下载(保留原文件名)

start "" "E:\aria2-1.37.0\aria2c.exe" "https://www.winrar.com.cn/download/winrar-x64-711scp.exe"

3. 下载并重命名本地文件

start "" "E:\aria2-1.37.0\aria2c.exe" "https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -o "winrar-711scp-01.exe"

4. 限制最大重试次数

start "" "E:\aria2-1.37.0\aria2c.exe" --max-tries=5 "https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -o "winrar-711scp-02.exe"

5. 开启多线程加速下载

start "" "E:\aria2-1.37.0\aria2c.exe" -x 1 -s 5 --max-tries=5 "https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -o "winrar-711scp-03.exe"

其中 -x 设置每个服务器连接数,-s 为分段数。


6. 设置下载超时时间

start "" "E:\aria2-1.37.0\aria2c.exe" --timeout=100 --max-tries=5 "https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -o "winrar-711scp-04.exe"

7. 限速下载(防止占用带宽)

start "" "E:\aria2-1.37.0\aria2c.exe" --max-overall-download-limit=100K --timeout=100 --max-tries=5 "https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -o "winrar-711scp-05.exe"

这里限制下载速度为 100KB/s。


8. 模拟浏览器请求(避免被服务器拦截)

start "" "E:\aria2-1.37.0\aria2c.exe" ^
--header="User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188" ^
--header="Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" ^
--header="Accept-Language: zh-CN,zh;q=0.9" ^
--max-overall-download-limit=100K --timeout=100 --max-tries=5 ^
"https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -o "winrar-711scp-06.exe"

这种方式可以模拟真实用户的浏览器行为,有助于绕过一些防爬虫或验证机制。


9. 静默下载并等待结束

start "" /b /wait "E:\aria2-1.37.0\aria2c.exe" "https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -o "winrar-711scp-07.exe" >nul 2>&1

/b 表示在当前窗口中后台执行,/wait 表示等待任务完成后再继续执行后续命令,>nul 2>&1 表示屏蔽命令输出,实现完全静默。


10. 切换工作目录和下载目录

rem 切换到工作目录(第一个"E:\test",缓存文件的存放路径),下载文件到下载目录(第二个"E:\test",下载文件的存放路径,路径后面必须没有\),并修改名称
start "" /d "E:\test" "E:\aria2-1.37.0\aria2c.exe" "https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -d "E:\test" -o "winrar-711scp-08.exe"

Aria2 批处理命令参数说明

参数部分含义与作用
start ""启动一个新进程。空字符串 "" 是窗口标题,必须保留。
/d "E:\test"指定新进程的工作目录(Working Directory)。aria2c 会在此目录下执行,临时文件等保存在此目录。
"E:\aria2-1.37.0\aria2c.exe"指定 aria2c.exe 的绝对路径,即下载程序的位置。
"https://...exe"下载链接,aria2c 会从该 URL 下载文件。
-d "E:\test"指定文件的下载目录。路径不能以反斜杠 \ 结尾,必须是合法的文件夹路径。
-o "winrar-711scp-08.exe"指定下载完成后保存的本地文件名称。默认会根据 URL 自动命名,这里是手动指定文件名。

重要提示:

  1. 下载目录 -d 路径不能带结尾反斜杠 \。如:E:\test 正确,E:\test\ 会导致错误或路径解析失败。
  2. aria2c 的默认行为是:
    • 把下载缓存、临时文件(如 .aria2 文件)存放在工作目录;
    • 把最终文件保存到 -d 指定的路径;
    • 如果不使用 -o,则根据 URL 自动命名。
  3. start/d 指定工作目录后,可以避免在主脚本中使用 cd /d 切换路径,更加清晰、模块化。

三、全部代码


切换到当前工作目录 E:\test
cd /d E:\test

使用aria2下载文件到当前工作目录
start "" "E:\aria2-1.37.0\aria2c.exe" "https://www.winrar.com.cn/download/winrar-x64-711scp.exe"

使用aria2下载文件到工作目录,并修改本地文件名称
start "" "E:\aria2-1.37.0\aria2c.exe" "https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -o "winrar-711scp-01.exe"

指定最大重试次数5次,下载并修改本地文件名称
start "" "E:\aria2-1.37.0\aria2c.exe" --max-tries=5 "https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -o "winrar-711scp-02.exe"

指定多线程下载,下载并修改本地文件名称
start "" "E:\aria2-1.37.0\aria2c.exe" -x 1 -s 5 --max-tries=5 "https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -o "winrar-711scp-03.exe"

将下载超时设置为100秒,指定最大重试次数5次,下载并修改本地文件名称
start "" "E:\aria2-1.37.0\aria2c.exe" --timeout=100 --max-tries=5 "https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -o "winrar-711scp-04.exe"

将下载速度限制为 100 Kbps,将下载超时设置为100秒,指定最大重试次数5次,下载并修改本地文件名称
start "" "E:\aria2-1.37.0\aria2c.exe" --max-overall-download-limit=100K --timeout=100 --max-tries=5 "https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -o "winrar-711scp-05.exe"

使用自定义 Referer,将下载速度限制为 100 Kbps,将下载超时设置为100秒,指定最大重试次数5次,下载并修改本地文件名称
start "" "E:\aria2-1.37.0\aria2c.exe" --header="User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188" --header="Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" --header="Accept-Language: zh-CN,zh;q=0.9" --max-overall-download-limit=100K --timeout=100 --max-tries=5 "https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -o "winrar-711scp-06.exe"

在批处理当前窗口静默下载,会阻挡当前窗口其他命令的执行,必须任务完成,才能继续下一步。
start "" /b /wait "E:\aria2-1.37.0\aria2c.exe" "https://www.winrar.com.cn/download/winrar-x64-711scp.exe" -o "winrar-711scp-07.exe" >nul 2>&1

应用实践

在autoit代码中,使用 aria2c 下载,功能正常,隐藏窗口,带下载进度输出,成功返回1,失败返回-1


; ========== 使用 aria2c 下载,功能正常,隐藏窗口,带进度 ==========
Func __Download_By_Aria2($url, $path)
    ; 找到最后一个反斜杠的位置以分隔文件夹和文件名
    Local $slashPos = StringInStr($path, "\", 0, -1)

    ; 检查路径格式是否正确
    If $slashPos = 0 Then
        ConsoleWrite("错误: 无效的保存路径。" & @CRLF)
        Return -2 ; 返回 -2 表示路径格式错误
    EndIf

    ; 提取目录部分,不带末尾反斜杠
    Local $dir = StringLeft($path, $slashPos - 1)
    ; 提取文件名部分
    Local $file = StringMid($path, $slashPos + 1)

    ; 如果目录不存在,则创建目录
    If Not FileExists($dir) Then DirCreate($dir)

    ; 检查 aria2c 可执行文件是否存在
    Local $aria2c = "C:\path\to\aria2c.exe" ; 请替换为实际的 aria2c 路径
    If Not FileExists($aria2c) Then
        ConsoleWrite("错误: 找不到 aria2c 可执行文件。" & @CRLF)
        Return -1 ; 返回 -1 表示 aria2c 不存在
    EndIf

    ; 构建执行 aria2c 的命令,指定 URL 和保存路径
    Local $cmd = '"' & $aria2c & '" --console-log-level=warn --summary-interval=1 -d "' & $dir & '" -o "' & $file & '" "' & $url & '"'

    ; 启动 aria2c 并重定向输出
    Local $iPID = Run($cmd, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)

    ; 正则表达式模式,用于匹配下载进度信息
    Local $sPattern = "\[#\w+\s+([\d\.]+[KMG]?iB)/([\d\.]+[KMG]?iB)\((\d+%)\)\s+CN:\d+\s+DL:([\d\.]+[KMG]?iB)\s+ETA:(\d+s)\]"

    ; 读取输出并解析进度
    While 1
        Local $sOutput = StdoutRead($iPID)
        If @error Then ExitLoop

        ; 解析输出中的进度信息
        If StringInStr($sOutput, "[#") Then
            Local $aMatch = StringRegExp($sOutput, $sPattern, 1)
            If Not @error Then
                ; 格式化进度信息
                Local $Match = $aMatch[0] & "/" & $aMatch[1] & " (" & $aMatch[2] & ")  " & $aMatch[3] & "/s " & $aMatch[4]
				; 显示下载进度到状态栏
                _GUICtrlStatusBar_SetText($Bar1, "下载中: " & $Match, 4)
            EndIf
        EndIf

        Sleep(1000) ; 每秒更新一次
    WEnd

    ; 检查下载是否完成
    If FileExists($path) And FileGetSize($path) > 1024 Then
        ConsoleWrite("下载完成!" & @CRLF)
        _GUICtrlStatusBar_SetText($Bar1, "下载完成!", 4)
        Return 1 ; 下载成功
    Else
        ConsoleWrite("错误: 下载失败或文件大小不足。" & @CRLF)
        Return -3 ; 返回 -3 表示下载失败或文件大小不足
    EndIf
EndFunc

四、总结建议

  • aria2 非常适合在批处理、脚本任务中批量下载文件。
  • 推荐在慢速或不稳定网络环境中使用限速+重试参数以增强容错性。
  • 在需要模拟浏览器时,可通过 --header 添加合适的 User-Agent 和 Referer。
  • 使用 start "" /wait 配合 >nul 2>&1 可以做到完全静默控制。
  • 如果出现“不是内部或外部命令”错误,请检查 aria2c.exe 的调用命令是否正确。

希望以上内容对你在实际工作中有所帮助。如果你也在做批量部署或离线下载自动化任务,不妨试试这款小巧而强大的工具 —— aria2。

如有疑问或改进建议,欢迎留言讨论!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注