我有一个以下批处理文件,它以JSON格式从数据库中检索数据,提取数字并存储它们:
set server=http://login:password@host:port
set db=PostgreSQL%%20DB
del IDs.txt
echo Section1 >> IDs.txt
curl "%server%/%db%/Section1" | jq .[] | jq .[] >> IDs.txt
echo Section2 >> IDs.txt
curl "%server%/%db%/Section2" | jq .[] | jq .[] >> IDs.txt
echo Section3 >> IDs.txt
curl "%server%/%db%/Section3" | jq .[] | jq .[] >> IDs.txt
...
它可以在Windows 8下运行,但在Windows XP下它会在第一个curl-jq行之后停止。没有错误。检索数字可以正常工作,但只能执行一次。
我尝试用
替换curl-jq调用cmd /c "curl %server%/%db%/Section3 | jq .[] | jq .[] >> IDs.txt"
但它没有帮助。
有什么问题?有没有办法在XP中使这个工作?
提前致谢。
更新:以下是输出JSON的示例:
{"ids":[80001]}
或
{"ids":[12001,12002,12003,43120]}
我需要的只是将数字提取为一列:
80001
或
12001
12002
12003
43120
答案 0 :(得分:1)
也许这对你有帮助吗?
@echo off
for /F "tokens=2 delims=[]" %%a in (input.txt) do (
for %%b in (%%a) do (
echo %%b
)
)
输出示例:
C:\> type input.txt
{"ids":[80001]}
C:\> test.bat
80001
C:\> type input.txt
{"ids":[12001,12002,12003,43120]}
C:\> test.bat
12001
12002
12003
43120
答案 1 :(得分:1)
不要试图使用jq
的两次调用,而是使用一次。此外,通常最好在命令行上提供jq
过滤器时引用它们。
您要将值转储到ids
属性中,所以:
jq ".ids[]"
[编辑:使用双引号适用于Windows和许多其他平台,但在非Windows平台上,单引号通常是最好的选择。]
答案 2 :(得分:0)
尝试使用此脚本,看看它是否符合您的要求。它不使用cURL来获取JSON,而是使用XMLHTTPRequest。它不使用jq来反序列化JSON,而是使用JavaScript JSON解析器。与Aacini的解决方案不同,无论JSON是否被缩小,美化,无论如何都是如此。用.bat扩展名保存。
@if (@CodeSection == @Batch) @then
@echo off & setlocal
set "server=http://login:password@host:port"
set "db=PostgreSQL DB"
>IDs.txt cscript /nologo /e:Jscript "%~f0" "%server%" "%db%"
goto :EOF
@end // end Batch / begin JScript hybrid chimera
var XHR = WSH.CreateObject('Microsoft.XMLHTTP'),
htmlfile = WSH.CreateObject('htmlfile'),
args = { 'server': WSH.Arguments(0), 'db': WSH.Arguments(1) },
url = encodeURI(args.server + '/' + args.db + '/Section'),
section = 0;
function fetch(url) {
XHR.open('GET', url, true);
XHR.setRequestHeader('User-Agent', 'XMLHTTP/1.0');
XHR.send('');
while (XHR.readyState != 4) { WSH.Sleep(50); }
return XHR.status == 200 ? XHR.responseText : '';
}
// import JSON method from htmlfile COM object
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />');
var JSON = htmlfile.parentWindow.JSON;
// fetch JSON by section sequentially until 404 error
while ((response = fetch(url + ++section))) {
WSH.Echo('Section' + section);
ids = JSON.parse(response).ids;
for (var i in ids) WSH.Echo(ids[i]);
}