[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 如何判断curl.exe并行下载时某个文件没有下载成功

使用下面的代码可以并行下载tim和qq的安装文件, 但是如果我把链接改成不存在的链接, 仍然会下载一个小的exe文件, 判断%errorlevel%也没有输出非0的值
  1. curl.exe --url "https://dldir1.qq.com/qqfile/qq/TIM3.5.0/TIM3.5.0.22143.exe" --output "C:\Users\administrator\desktop\tim.exe" --location --tr-encoding --globoff --noproxy * --next --url "https://dldir1.qq.com/qqfile/qq/QQNT/Windows/QQ_9.9.15_240902_x64_01.exe" --output "C:\Users\administrator\desktop\qq.exe" --location --tr-encoding --globoff --noproxy * --parallel
复制代码

你提到的问题是由于 `curl` 在下载时,即使目标文件不存在,服务器可能会返回一个错误页面或重定向到一个默认页面,而这个页面会被保存为一个小的 `.exe` 文件。由于 `curl` 默认情况下不会因为 HTTP 错误状态码(如 404)而返回非零的 `%errorlevel%`,因此你无法通过 `%errorlevel%` 来判断下载是否成功。

要解决这个问题,你可以使用 `curl` 的 `--fail` 选项。这个选项会让 `curl` 在 HTTP 错误状态码(如 404 或 500)时返回非零的 `%errorlevel%`,并且不会保存错误页面到输出文件中。

以下是修改后的代码:

```bash
curl.exe --url "https://dldir1.qq.com/qqfile/qq/TIM3.5.0/TIM3.5.0.22143.exe" --output "C:\Users\administrator\desktop\tim.exe" --location --tr-encoding --globoff --noproxy * --fail --next --url "https://dldir1.qq.com/qqfile/qq/QQNT/Windows/QQ_9.9.15_240902_x64_01.exe" --output "C:\Users\administrator\desktop\qq.exe" --location --tr-encoding --globoff --noproxy * --fail --parallel
```

### 解释:
- `--fail`:如果服务器返回的 HTTP 状态码是 400 或更高,`curl` 会返回非零的 `%errorlevel%`,并且不会保存错误页面到输出文件中。

### 进一步优化:
如果你希望在下载失败时删除已经下载的部分文件,可以在 `curl` 命令后添加一个条件判断:

```bash
curl.exe --url "https://dldir1.qq.com/qqfile/qq/TIM3.5.0/TIM3.5.0.22143.exe" --output "C:\Users\administrator\desktop\tim.exe" --location --tr-encoding --globoff --noproxy * --fail --next --url "https://dldir1.qq.com/qqfile/qq/QQNT/Windows/QQ_9.9.15_240902_x64_01.exe" --output "C:\Users\administrator\desktop\qq.exe" --location --tr-encoding --globoff --noproxy * --fail --parallel

if errorlevel 1 (
    echo 下载失败,删除已下载的文件...
    del "C:\Users\administrator\desktop\tim.exe"
    del "C:\Users\administrator\desktop\qq.exe"
    exit /b 1
)
```

### 解释:
- `if errorlevel 1`:如果 `curl` 返回的 `%errorlevel%` 大于或等于 1,表示下载失败。
- `del`:删除已经下载的部分文件。
- `exit /b 1`:退出脚本并返回错误码 1。

这样,当下载失败时,脚本会自动删除已经下载的部分文件,并且返回非零的错误码。

TOP

返回列表