Строковые литералы в JQ с использованием PowerShell [дубликат]

Nov 30 2020

Я не могу заставить строковые литералы JQ работать из Powershell. Например, это выводит красивый объект JSON в Bash, но не работает в Powershell:

PS C:\temp> jq --null-input '{"key":"val"}'

jq: error: val/0 is not defined at <top-level>, line 1:
{key:val}
jq: 1 compile error

Сначала я заподозрил некорректное цитирование, но Write-Output '{"key":"val"}'результаты {"key":"val"}ожидаются.

Я могу обойти это, записав свой JQ-фильтр в файл. Использование .NET WriteAllTextгарантирует, что файл будет закодирован как UTF-8 без спецификации.

PS C:\temp> [System.IO.File]::WriteAllText('basic.jq', '{"key":"val"}')
PS C:\temp> jq --null-input --from-file basic.jq
{
  "key": "val"
}

Я ищу более гибкий подход к прототипированию фильтров JQ и интеграции их в сценарии PowerShell.

Версии: JQ 1.6 для win64, PS Версия 5.1.18362.1171

Ответы

1 Inian Nov 30 2020 at 21:20

Powershell может потребовать, чтобы вы избегали двойных кавычек внутри '..'выражения. Пытаться

jq --null-input '{ "key": \"val\" }'

или чуть ниже, так как имена ключей в jqявной цитате не нуждаются

jq --null-input '{ key: \"val\" }'

Из jqруководства в разделе - Вызов jq

При использовании командной оболочки Windows ( cmd.exe) лучше всего использовать двойные кавычки в вашей программе jq, когда они указаны в командной строке (вместо -f program-fileпараметра), но тогда двойные кавычки в программе jq требуют экранирования обратной косой черты.