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
相关产品推荐
相关产品推荐

