You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码说明

  1. 日期格式适配:如果API中的日期文件夹格式是yyyyMMdd(如20241204),只需修改ToString("yyyyMMdd")即可
  2. 增量逻辑扩展:若需要检测API文件是否更新后再下载,可添加Invoke-WebRequest -Method HEAD获取Last-Modified响应头,对比本地文件的修改时间后决定是否重新下载
  3. 错误处理:通过try/catch捕获下载异常,避免单个文件下载失败导致整个脚本中断
  4. 目录结构同步:自动创建与API对应的本地日期文件夹,保持文件结构一致

内容的提问来源于stack exchange,提问作者Jeremy Reynolds

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:56:14