Bat脚本调用WebClient.DownloadFile报错且文件过小,求问题排查
问题分析与解决:Google Drive链接下载失败的Bat脚本问题
问题描述
编写Bat脚本从指定Google Drive链接下载文件时,抛出错误:调用DownloadFile(含2个参数)时发生异常:WebClient请求期间出现异常错误,且下载文件大小远小于正常文件。原脚本代码如下:
@echo off rem ============================================================================ rem -- Set up environment ------------------------------------------------------ rem ============================================================================ set SCRIPT_DIR=%~dp0 set CONTENT_FOLDER=%SCRIPT_DIR%Unreal/CarlaUE4/Content/Carla rem ============================================================================ rem -- Get the last version to download ---------------------------------------- rem ============================================================================ if not exist "%CONTENT_FOLDER%" mkdir "%CONTENT_FOLDER%" set CONTENT_ID = BP_Camera set CONTENT_LINK=https://drive.google.com/uc?export=download&id=1L72sa5Egy1nJbv_7L75nbUV0vjGxzvsK set CONTENT_FILE=%CONTENT_FOLDER%/%CONTENT_ID%.uasset ) rem ============================================================================ rem -- Download the content ---------------------------------------------------- rem ============================================================================ echo Downloading "%CONTENT_LINK%"... powershell -Command "(New-Object System.Net.WebClient).DownloadFile('%CONTENT_LINK%', 'BP_Camera.uasset')"
错误点分析
- 变量定义语法错误:
set CONTENT_ID = BP_Camera中等号两侧有空格,Bat中变量定义不能留空格,否则变量名会变成CONTENT_ID(带尾空格),值为BP_Camera(带头空格),导致后续CONTENT_FILE路径拼接错误。 - 无效语法字符:代码中存在一个多余的闭合括号
),会导致脚本执行时提前终止,触发语法报错。 - Google Drive链接限制:直接使用
uc?export=download链接下载较大文件时,Google会触发安全验证,WebClient会下载到验证页面的HTML文件(大小很小),而非目标文件。 - 下载路径错误:Powershell命令中硬编码了文件名
BP_Camera.uasset,未使用之前定义的CONTENT_FILE变量,导致文件下载到脚本当前执行目录,而非指定的CONTENT_FOLDER目录。
修正后的脚本
@echo off rem ============================================================================ rem -- Set up environment ------------------------------------------------------ rem ============================================================================ set "SCRIPT_DIR=%~dp0" set "CONTENT_FOLDER=%SCRIPT_DIR%Unreal/CarlaUE4/Content/Carla" rem ============================================================================ rem -- Get the last version to download ---------------------------------------- rem ============================================================================ if not exist "%CONTENT_FOLDER%" mkdir "%CONTENT_FOLDER%" set "CONTENT_ID=BP_Camera" set "CONTENT_LINK=https://drive.google.com/uc?export=download&id=1L72sa5Egy1nJbv_7L75nbUV0vjGxzvsK" set "CONTENT_FILE=%CONTENT_FOLDER%/%CONTENT_ID%.uasset" rem ============================================================================ rem -- Download the content ---------------------------------------------------- rem ============================================================================ echo Downloading "%CONTENT_LINK%" to "%CONTENT_FILE%"... powershell -Command "(New-Object System.Net.WebClient).DownloadFile('%CONTENT_LINK%', '%CONTENT_FILE%')"
额外说明
如果下载仍然失败(文件还是HTML),说明Google Drive触发了安全验证,需要改用支持处理验证的下载方式,比如使用Powershell的Invoke-WebRequest并处理Cookie:
powershell -Command "$url='%CONTENT_LINK%'; $output='%CONTENT_FILE%'; $wc=New-Object System.Net.WebClient; $wc.Headers.Add('Cookie', 'download_warning_1L72sa5Egy1nJbv_7L75nbUV0vjGxzvsK=1'); $wc.DownloadFile($url, $output)"
注:download_warning_<文件ID>中的文件ID需要对应你的链接中的ID值,若验证页面变化,可能需要手动获取对应的Cookie值。
内容的提问来源于stack exchange,提问作者Rony Shaji
相关产品推荐
相关产品推荐

