【问题标题】:JQ with Windows Batch - select failingJQ with Windows Batch - 选择失败
【发布时间】:2021-08-31 12:59:47
【问题描述】:

使用带有 JQ 的 Windows 批处理文件并尝试通过管道传输选择过滤器。

使用 JQ 解析的示例 Json:

{
  "name": "test-mmc-deploy",
  "id": "local$3d2075c5-73c0-47aa-8df5-cee3a70f68c4",
  "lastModified": "Mon, 1 May 2017 13:56:15.980 AEST",
  "servers": [
    "local$520ee705-bdbb-4132-94cf-63bb213d2b46"
  ],
  "status": "DEPLOYED",
  "applications": [
    "local$f3d791bd-14d9-4491-9541-5fa04d8c3164"
  ],
  "href": "http://localhost:9090/mmc-console-3.8.2/api/deployments/local$3d2075c5-73c0-47aa-8df5-cee3a70f68c4",
  "clusterNames": [],
  "reconciled": false,
  "clusterIds": []
}

普通命令行 JQ 与 Curl 配合使用,输出如下:

curl --basic -u admin:admin http://localhost:9090/mmc-console-3.8.2/api/deployments | jq ".data[] | select(.name==\"test-mmc-deploy\").id

“本地$3d2075c5-73c0-47aa-8df5-cee3a70f68c4”

试图让下面的命令在 Windows 批处理文件中工作正在创造一个转义字符的噩梦。需要一些帮助。

for /f "tokens=*" %%a in ('echo %%app_deploy_list%% ^| jq "".data[] ^| select(.name==\"test-mmc-deploy\"^).id""') do (set app_id=%%a)
echo Application found: %app_id%

其中 %%app_deploy_list%% 保存上面声明的 json。

我得到的错误是: 'select' 未被识别为内部或外部命令

【问题讨论】:

  • 你为什么用%%app_deploy_list%%而不是%app_deploy_list%
  • 嗨,SomethingDark,这是一个错误,我会删除它,但不会对选择错误的批处理编译器产生影响。

标签: json windows batch-file mule jq


【解决方案1】:

您不必要地转义了一些东西,命令解释器可能会按字面意思插入它们。那和你对双引号的使用是不一致的。您可能过早地切断了字符串,并且过滤器正在作为附加管道命令有效地运行。

直接在命令提示符下运行它对我有用:

for /f "tokens=*" %a in ('jq ".data[] | select(.name==\"test-mmc-deploy\").id" input.json') do (echo "Application found: %a")

然后在批处理文件中,需要将循环变量的 % 加倍。

for /f "tokens=*" %%a in ('jq ".data[] | select(.name==\"test-mmc-deploy\").id" input.json') do (
    set app_id=%%a
)
echo Application found: %app_id%

为了能够将 curl 响应直接通过管道传输到 jq,只需转义管道(仅此而已)。

for /f "tokens=*" %%a in ('curl --basic -u admin:admin http://localhost:9090/mmc-console-3.8.2/api/deployments ^| jq ".data[] | select(.name==\"test-mmc-deploy\").id"') do (
    set app_id=%%a
)
echo Application found: %app_id%

【讨论】:

  • 我有点惊讶它的工作原理;通常,|s 和 )s 内部的 in 需要转义。
  • 嗨,Mercado,我不想保存文件,而是使用作为批处理的一部分创建的变量
  • 尝试使用这个 ...for /f "tokens=*" %%a in ('echo %app_deploy_list% ^| jq ".data[] ^| select^(.name== \"test-mmc-deploy\"^).id"') do (set app_id=%%a) 产生:jq:错误:语法错误,意外的 INVALID_CHARACTER,期待 $end(Windows cmd shell 引用问题?)在 ,第 1 行:.data[] ^| select^(.name=="test-mmc-deploy"^).id
  • @SomethingDark:我不知道 Windows 命令行的转义规则,我宁愿使用 bash 或 powershell 提示符。但我知道你的意思。但据我记得,您只需要它们用于未引用的参数。这里引用了所有内容,所以我认为没有必要。但我可能是错的。
  • 将此标记为正确 - 尽管不保存本地文件就无法解决
【解决方案2】:

Windows 正在尝试将jq 的输出通过管道传输到select,但找不到可执行文件select

我不熟悉 curljq,但您似乎需要文字 |。在您使用的引用命令格式中,可以使用 ^^^| 生成文字 |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-25
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多