You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用PowerShell批量下载多个文件

嘿,我来分享一个经过优化的PowerShell批量下载文件的方案,特别适合需要定期调度执行的场景!之前感谢@Matt的提醒,让我把细节补得更完善,这样大家用的时候也能更顺畅地复用~

使用PowerShell批量下载多个文件的优化方案

核心优化调整

  • 每次执行自动清理旧日志:因为脚本要被调度运行,保留旧日志不仅占空间,还容易混淆不同批次的执行记录,所以每次启动脚本时会先删除之前的日志文件
  • 添加下载重试机制:针对临时网络波动导致的下载失败,增加了最多3次的重试逻辑,同时每次失败后等待5秒再尝试,提升下载成功率
  • 详细日志记录:所有操作(目录创建、下载成功/失败、重试记录)都会写入日志,方便后续排查问题

完整脚本示例

# 定义需要下载的文件列表:URL + 本地保存路径
$downloadList = @(
    @{Url = "https://example.com/file1.zip"; Path = "C:\Downloads\file1.zip"},
    @{Url = "https://example.com/file2.exe"; Path = "C:\Downloads\file2.exe"},
    @{Url = "https://example.com/document.pdf"; Path = "C:\Downloads\Docs\document.pdf"}
    # 可根据需求继续添加更多文件条目
)

# 日志文件保存路径
$logPath = "C:\Downloads\BatchDownloadLog.log"

# 第一步:清理旧日志文件
if (Test-Path $logPath) {
    Remove-Item $logPath -Force
    Write-Host "已清理历史日志文件"
}

# 初始化本次任务日志
"=== 批量下载任务启动:$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ===" | Out-File $logPath -Append

# 循环处理每个下载任务
foreach ($item in $downloadList) {
    $targetUrl = $item.Url
    $localSavePath = $item.Path
    $maxRetry = 3  # 设置最大重试次数

    # 确保保存目录存在
    $saveDirectory = Split-Path $localSavePath -Parent
    if (-not (Test-Path $saveDirectory)) {
        New-Item -ItemType Directory -Path $saveDirectory | Out-Null
        "已创建保存目录:$saveDirectory" | Out-File $logPath -Append
    }

    # 执行下载+重试逻辑
    $downloadSuccess = $false
    for ($retryIndex=1; $retryIndex -le $maxRetry; $retryIndex++) {
        try {
            Invoke-WebRequest -Uri $targetUrl -OutFile $localSavePath -ErrorAction Stop
            "下载成功:[$targetUrl] → [$localSavePath]" | Out-File $logPath -Append
            $downloadSuccess = $true
            break
        }
        catch {
            "第$retryIndex次下载失败:[$targetUrl],错误信息:$($_.Exception.Message)" | Out-File $logPath -Append
            Start-Sleep -Seconds 5  # 失败后等待5秒再重试
        }
    }

    if (-not $downloadSuccess) {
        "最终下载失败:[$targetUrl],已重试$maxRetry次" | Out-File $logPath -Append
    }
}

"=== 批量下载任务结束:$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ===" | Out-File $logPath -Append
Write-Host "批量下载任务执行完毕,详细日志请查看:$logPath"

使用说明

  • 配置下载列表:在$downloadList数组中按照示例格式添加你需要的文件URL和本地保存路径即可,支持子目录路径
  • 日志管理:脚本每次启动会自动删除旧日志,只保留本次任务的完整记录,避免日志文件无限膨胀
  • 调度执行:如果需要定期自动执行,可以通过Windows任务计划程序创建任务,指定运行这个PowerShell脚本即可,比如设置每天凌晨自动运行
  • 自定义调整:你可以根据自己的需求修改重试次数($maxRetry)、重试等待时间(Start-Sleep的参数),或者更换下载命令(比如用Invoke-RestMethod替代Invoke-WebRequest,适合大文件场景)

内容的提问来源于stack exchange,提问作者Camilo Riviere

火山引擎 最新活动