如何使用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




