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

PowerShell for循环offset分页拉取API导出JSON脚本问题求助

脚本存在的核心问题
  • 循环逻辑完全错误:初始值设为$i=101但终止条件写的是$i -le 70,循环体一次都不会执行;且offset累加规则不符合要求,无法生成101、201…7001的正确参数序列
  • 语法错误+字符串插值失效:PowerShell仅双引号包裹的字符串支持变量解析,原脚本Uri用单引号开头,内部的$($i+100)不会被替换为实际数值,末尾还多了一个多余的双引号,会直接触发语法报错
  • 数据合并逻辑错误:循环内先执行$concat = $response.offers会直接覆盖之前已经合并好的历史数据,后续追加操作仅保留当前页内容,无法实现全量累加
  • 潜在兼容问题:ConvertTo-Json默认序列化深度仅为2,嵌套结构会被序列化为空值;输出用bigendianunicode编码在大部分JSON解析场景下会出现乱码
修正后的可运行脚本
# 初始化全量数据存储数组
$allOffers = @()
# 基础接口地址
$baseUri = "https://test/api/offers?api_key=123456&max=100"

try {
    # 拉取第一页(无offset)数据
    $firstPageResp = Invoke-RestMethod -Uri $baseUri -Method GET -ContentType 'application/json'
    $allOffers += $firstPageResp.offers

    # 循环拉取分页:offset从101开始,每次步长100,到7001截止,共70次分页请求
    for ($offset = 101; $offset -le 7001; $offset += 100) {
        $currentPageUri = "$baseUri&offset=$offset"
        $pageResp = Invoke-RestMethod -Uri $currentPageUri -Method GET -ContentType 'application/json'
        $allOffers += $pageResp.offers
        # 可选:打印拉取进度
        Write-Host "已完成offset=$offset页拉取,当前累计数据量:$($allOffers.Count)"
    }

    # 导出结果,指定序列化深度避免嵌套数据丢失,用UTF8编码适配通用场景
    $allOffers | ConvertTo-Json -Depth 10 | Out-File "C:\TEMP\API_RESULT.json" -Encoding utf8
    Write-Host "全量拉取完成,总数据量:$($allOffers.Count),文件已保存至C:\TEMP\API_RESULT.json"
}
catch {
    Write-Error "接口请求异常:$_"
}
关键修改说明
  • 重构循环规则:offset初始值设为101,步长固定100,终止值设为7001,刚好匹配需要的70次分页请求,加上首页请求完整覆盖所有数据段
  • 修正字符串规则:Uri统一用双引号包裹保证变量正常解析,移除多余的错误引号
  • 修正合并逻辑:初始化空数组后,每页数据直接追加到全量数组,不会出现历史数据被覆盖的问题
  • 新增异常捕获:单页请求失败时会直接抛出错误信息,方便快速定位问题
  • 序列化参数优化:给ConvertTo-Json增加-Depth 10参数,避免深层嵌套结构被序列化异常;输出编码改为UTF8,兼容绝大多数JSON解析工具

内容的提问来源于stack exchange,提问作者Hugo Pereira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:27:39