使用PowerShell从REST API递归下载日期文件夹中的多文件
PowerShell 递归增量下载REST API中日期文件夹的静态文件
原代码存在的问题
- 硬编码单个日期路径,无法自动遍历多个日期文件夹
- 未处理每个日期下的多个目标静态文件(如file1.xml、file2.xml)
- 循环中误用全局变量
$url而非当前迭代的$URL,导致文件名提取错误 - 缺少增量下载逻辑,会重复下载已存在的文件
改进后的完整代码
# -------------------------- 配置参数 -------------------------- # API基础路径(日期文件夹的上级路径) $apiBaseUrl = "https://caccteqjx2.test.etadirect.com/rest/ofscCore/v1/folders/dailyExtract/folders/" # 需要下载的静态文件名列表 $targetFiles = @("file1.xml", "file2.xml") # 增量下载起始日期(可改为本地已存在的最新日期,或固定起始日) $startDate = Get-Date "2024-03-05" # 结束日期(默认当天,可改为固定日期) $endDate = Get-Date # 本地保存根目录 $localRootPath = "C:\temp\dailyExtract" # 获取API访问凭据 $credentials = Get-Credential # -------------------------- 生成日期范围 -------------------------- # 生成从起始日到结束日的所有日期,格式匹配API中的日期文件夹格式 $dateRange = while ($startDate -le $endDate) { $startDate.ToString("yyyy-MM-dd") $startDate = $startDate.AddDays(1) } # -------------------------- 执行增量下载 -------------------------- # 确保本地根目录存在 if (-not (Test-Path $localRootPath)) { New-Item -Path $localRootPath -ItemType Directory | Out-Null } $totalTasks = $dateRange.Count * $targetFiles.Count $currentTask = 0 foreach ($dateFolder in $dateRange) { # 拼接当前日期的API路径 $dateApiPath = $apiBaseUrl + $dateFolder + "/" # 创建本地对应日期的文件夹 $localDatePath = Join-Path -Path $localRootPath -ChildPath $dateFolder if (-not (Test-Path $localDatePath)) { New-Item -Path $localDatePath -ItemType Directory | Out-Null } foreach ($fileName in $targetFiles) { $currentTask++ $fileApiUrl = $dateApiPath + $fileName $localFilePath = Join-Path -Path $localDatePath -ChildPath $fileName # 显示全局下载进度 Write-Progress -Activity "增量下载文件" -Status "处理 $dateFolder/$fileName ($currentTask/$totalTasks)" -PercentComplete (($currentTask / $totalTasks) * 100) # 增量判断:本地已存在则跳过(可扩展为对比文件修改时间) if (Test-Path $localFilePath) { Write-Host "已存在,跳过:$localFilePath" -ForegroundColor Cyan continue } try { # 下载文件 Invoke-WebRequest -Uri $fileApiUrl -OutFile $localFilePath -Credential $credentials -ErrorAction Stop Write-Host "下载完成:$localFilePath" -ForegroundColor Green } catch { Write-Host "下载失败 $fileApiUrl:$_" -ForegroundColor Red } } } Write-Progress -Activity "增量下载文件" -Completed -Status "所有任务处理完毕" Write-Host "下载任务结束" -ForegroundColor Green
代码说明
- 日期格式适配:如果API中的日期文件夹格式是
yyyyMMdd(如20241204),只需修改ToString("yyyyMMdd")即可 - 增量逻辑扩展:若需要检测API文件是否更新后再下载,可添加
Invoke-WebRequest -Method HEAD获取Last-Modified响应头,对比本地文件的修改时间后决定是否重新下载 - 错误处理:通过
try/catch捕获下载异常,避免单个文件下载失败导致整个脚本中断 - 目录结构同步:自动创建与API对应的本地日期文件夹,保持文件结构一致
内容的提问来源于stack exchange,提问作者Jeremy Reynolds
相关产品推荐
相关产品推荐

