微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解析 bat 文件中的 JSON

如何解决解析 bat 文件中的 JSON

我正在批处理文件调用 curl 命令。该请求给了我一个 JSON 响应。我将该 JSON 响应存储在文件中。我想知道如何解析此 JSON 并获取特定属性

test.bat

%comspec% /c curl -L -c cookie -b cookie -X POST -H "Accept: application/json" -s -d "{\"id\":\"123456789\",\"part\":\"part\",\"duration\":1400}" https://abcd.com > MyIP.txt
set /p string1=<MyIP.txt

以上工作正常并将 JSON 存储在文件中。虚拟响应如下所示:

{"aki":"abcd","assumed":"cdef","expiration":12345,"sa":"temp/abcdefgh","st":"abcd+/00'nget"}

我需要从这个响应中获取 'aki' 和 'sa' 变量并将它们存储到另一个文件中。

解决方法

我尝试了在您共享的线程中磨练的一个遇见,但输出为空:

这正是为什么不建议在没有适当工具的情况下在纯 cmd/Batch 中执行此操作的原因。

虽然您评论中的代码和 JSON 确实有效...

ECHO %other% %year% %value% %time%
1234 2016 str 05:01

...让您陷入麻烦的事情之一是原始 JSON 响应 ("abcd+/00'nget") 中的单引号。您必须转义所有必要的字符才能完成这项工作。像 这样可以正确处理 JSON 的工具可以向您展示:

ECHO {"aki":"abcd","assumed":"cdef","expiration":12345,"sa":"temp/abcdefgh","st":"abcd+/00'nget"} | ^
  xidel - -se "string:=$json" --output-format=cmd
SET string={^"aki^": ^"abcd^"^,^"assumed^": ^"cdef^"^,^"expiration^": 12345^,^"sa^": ^"temp/abcdefgh^"^,^"st^": ^"abcd+/00'nget^"}

所以以下可以工作:

SET string={^"aki^": ^"abcd^"^,^"st^": ^"abcd+/00'nget^"}
SET string=%string:"=%
SET "string=%string:~1,-1%"
SET "string=%string:: ==%"
SET "%string:,=" & set "%"

ECHO %aki% %sa%
abcd temp/abcdefgh

但相反,我建议从一开始就使用

xidel -s ^
-H "Cookie: [...]" -H "Accept: application/json" ^
-d "{{\"id\":\"123456789\",\"part\":\"part\",\"duration\":1400}}" ^
https://abcd.com ^
-e "$json" -e "$json/(aki,sa)"
{
  "aki": "abcd","assumed": "cdef","expiration": 12345,"sa": "temp/abcdefgh","st": "abcd+/00'nget"
}
abcd
temp/abcdefgh

(不是 100% 确定,因为我显然无法测试)

,

考虑到 Gerhard 的评论,这里有一个 hack,旨在仅处理您提交的 MyIP.txt 中的内容:

@For /F "Delims==" %%G In ('"(Set $) 2>NUL"') Do Set "%%G="
@For /F "UseBackQ Tokens=1 Delims={}" %%G In ("MYIP.txt") Do @For %%H In (%%G
 ) Do @For /F Tokens^=1-2^ Delims^=:^" %%I In ("%%~H") Do @Set "$%%I=%%J"
@(Set $ 2>NUL) && Pause

最后一行将简单地向您显示它定义的所有变量,(应该是您的每个密钥对)

如果您只想显示/使用其中的两个,在本例中为 akisa,那么最后一行可以相应地更改:

@For /F "Delims==" %%G In ('"(Set $) 2>NUL"') Do Set "%%G="
@For /F "UseBackQ Tokens=1 Delims={}" %%G In ("MYIP.txt") Do @For %%H In (%%G
 ) Do @For /F Tokens^=1-2^ Delims^=:^" %%I In ("%%~H") Do @Set "$%%I=%%J"
@Echo %$aki% & Echo %$sa% & Pause

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。