【问题标题】:Batch file stops after a series of pipes in XPXP中的一系列管道后批处理文件停止
【发布时间】:2016-04-19 18:26:49
【问题描述】:

我有以下批处理文件,它以 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

【问题讨论】:

  • 只是为了排除显而易见的问题,您没有将 64 位版本的 jq 从 Win 8 复制到您的 XP 机器中,对吗?
  • 一个有效的问题。 curljq 在命令行中都能正常工作。它是来自官方网站的“jq-win32.exe”。如何查看jq是否有问题?
  • 您是否在脚本顶部设置了@echo off?如果是这样,请尝试将其标记出来 (rem @echo off) 并查看停止脚本的行是否按照您编写它的方式进行评估。我想知道你是否有什么东西没有给我们看。 curl | jq | jq 命令是否位于括号代码块中(if 语句或 for 循环)?如果是这样,您可能需要延迟扩展 !server!!db!
  • 我没有echo off。所有行都被正确评估。生成的结果是正确的,唯一的问题是批处理文件没有继续到第二行。我唯一更改的是服务器和部分 URL。卷曲 | jq | jq 行不在循环内,但我确实计划稍后将它们放入for 循环中。这会增加更多的问题吗?我确实尝试用call :IDout Section1 %out% %server% %db% 或对外部批处理的类似调用替换echo-curl 行(并且必须用%%%%20 替换%%20)。结果是一样的:Section1 的 ID 写入后执行停止。
  • @rojo:行动! rep-1 初学者的另一个问题,他不关心他/她的问题!这是我不喜欢回答新成员问题的主要原因... :(

标签: windows batch-file curl jq


【解决方案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

【讨论】:

  • 这个答案值得一些爱,即使 OP 无处可见。
【解决方案2】:

试试这个脚本,看看它是否符合您的要求。它不依赖 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]);
}

【讨论】:

    【解决方案3】:

    与其尝试使用jq 的两次调用,不如使用一次。此外,在命令行中给出jq 过滤器时,通常最好引用它们。

    您正在转储 ids 属性中的值,因此:

    jq ".ids[]"
    

    [编辑:在这里使用双引号适用于 Windows 和许多其他平台,但在非 Windows 平台上,单引号通常是最好的选择。]

    【讨论】:

    • 这个答案值得一些爱,即使 OP 无处可见。
    猜你喜欢
    • 2015-01-24
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2010-12-02
    • 1970-01-01
    • 2023-04-05
    • 2012-03-23
    相关资源
    最近更新 更多