Windows批处理不支持原生JSON解析,复杂结构易出错;推荐优先用PowerShell(Win7 SP1+自带)调用ConvertFrom-Json,或使用轻量jq工具;避免纯批处理硬解析嵌套/转义/含特殊字符的JSON。Windows 批处理本身不支持原生 JSON 解析,尤其面对嵌套对象、数组、转义字符、多层结构等复杂格式时,纯 `for /f` + `delims/tokens` 方式极易出错或失效。但实际工作中仍有轻量级需求(比如提取某个固定路径的字段),可通过组合系统命令+外部工具实现可靠提取。关键不是“硬刚语法”,而是选对方法层级。
优先用 PowerShell 替代批处理
windows 7 sp1 及以后系统默认自带 powershell,它原生支持 json(convertfrom-json),语义清晰、容错强,且能处理任意深度嵌套:
- 例如提取
{"data":{"user":{"id":123,"name":"Alice"}}}中的user.name: powershell -Command "$j=Get-Content data.json | ConvertFrom-Json; $j.data.user.name"- 结果直接输出
Alice,无需手动切分、去引号、跳空格 - 若需在 .bat 中调用,可写成一行:
for /f "delims=" %%i in ('powershell -Command "$j=gc data.json|ConvertFrom-Json; $j.data.user.id" 2^>nul') do set id=%%i
用轻量级外部工具(如 jq for Windows)
如果必须用 cmd 环境且不能依赖 PowerShell(如受限策略),推荐 jq —— 它是 JSON 处理的事实标准命令行工具,Windows 版本体积小、无依赖、单文件可执行:
- 下载
jq.exe(官方 release 页面提供 Windows x64/x86 版) - 放入脚本同目录或系统 PATH
- 提取
random_id:jq -r ".random_id" data.json - 提取数组第 2 项的 name:
jq -r ".items[1].name" data.json - 配合批处理变量赋值:
for /f "delims=" %%a in ('jq -r ".token" response.json') do set TOKEN=%%a
避免用纯批处理硬解析复杂 JSON
网上常见“用 for /f delims=: tokens=2 提取值”的做法,只适用于扁平、无逗号/冒号干扰、无嵌套的极简 JSON(如 {"key":"value"})。一旦出现以下任一情况,就会失败:
- 字段值本身含冒号或逗号(如 URL、时间戳、错误信息)
- 存在嵌套对象或数组(
"config":{"timeout":30}) - 字符串含转义字符(
"msg":"a\"b") - 键名含空格或特殊符号(
"user id":123)
强行用字符串分割模拟解析,本质是正则脆弱匹配,维护成本高、不可靠,不建议用于生产环境。
临时方案:转为 PowerShell 再回传给批处理
若脚本主体是 .bat,又想保持兼容性,可把 JSON 解析逻辑外包给临时 PowerShell 片段:
- 写一个
parse.ps1脚本,接收 JSON 文件路径和查询路径(如$.data.token) - 在 .bat 中调用:
powershell -ExecutionPolicy Bypass -File parse.ps1 data.json "$.data.token" > temp.txt - 再用
set /p TOKEN=<temp.txt> 读取结果</temp.txt> - 这样既规避了批处理能力短板,又不需要额外部署工具


















