解析bat文件中的JSON
Parse JSON in bat file
我正在批处理文件中调用 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' 变量并将它们存储到另一个文件中。
考虑到 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
最后一行将简单地向您显示它定义的所有变量,(应该是您的每个密钥对)。
如果您只想 show/use 其中两个,在本例中为 aki
和 sa
,那么最后一行可以相应地更改:
@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
I tried one met honed in the thread you shared, but the output is coming as empty:
这正是不建议在没有适当工具的情况下以纯 cmd
/批处理方式执行此操作的原因。
虽然您评论中的代码和 JSON 确实有效...
ECHO %other% %year% %value% %time%
1234 2016 str 05:01
...给您带来麻烦的其中一件事是您原始 JSON 响应 ("abcd+/00'nget"
) 中的单引号。您必须转义所有必要的字符才能完成这项工作。像 xidel 这样正确处理 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^"^, ^"assumed^": ^"cdef^"^, ^"expiration^": 12345^, ^"sa^": ^"temp/abcdefgh^"^, ^"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:
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% 确定,因为我显然无法测试)
我正在批处理文件中调用 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' 变量并将它们存储到另一个文件中。
考虑到 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
最后一行将简单地向您显示它定义的所有变量,(应该是您的每个密钥对)。
如果您只想 show/use 其中两个,在本例中为 aki
和 sa
,那么最后一行可以相应地更改:
@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
I tried one met honed in the thread you shared, but the output is coming as empty:
这正是不建议在没有适当工具的情况下以纯 cmd
/批处理方式执行此操作的原因。
虽然您评论中的代码和 JSON 确实有效...
ECHO %other% %year% %value% %time%
1234 2016 str 05:01
...给您带来麻烦的其中一件事是您原始 JSON 响应 ("abcd+/00'nget"
) 中的单引号。您必须转义所有必要的字符才能完成这项工作。像 xidel 这样正确处理 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^"^, ^"assumed^": ^"cdef^"^, ^"expiration^": 12345^, ^"sa^": ^"temp/abcdefgh^"^, ^"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:
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% 确定,因为我显然无法测试)