Строковые литералы в JQ с использованием PowerShell

Я не могу заставить работать строковые литералы 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


person ssenator    schedule 30.11.2020    source источник


Ответы (1)


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

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

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

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

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

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

person Inian    schedule 30.11.2020
comment
Это работает! Однако я не понимаю, почему - about_Quoting_Rules в PowerShell состояниях. Когда вы заключаете строку в одинарные кавычки (строка в одинарных кавычках), строка передается команде точно в том виде, в каком вы ее вводите. Замена не производится. Так что же в мире происходит? Почему обрабатываются обратные косые черты и каким процессом? - person ssenator; 30.11.2020
comment
@ssenator Это не метод выхода для PowerShell. Это должно вызывать командную оболочку для запуска исполняемого файла. Внутри одинарных кавычек внутреннее содержимое буквально читается в PowerShell. - person AdminOfThings; 30.11.2020
comment
@ssenator: Печальная правда заключается в том, что аргумент PowerShell, передаваемый во внешние программы, всегда был нарушен и все еще остается в версии 7.1 - и есть сопротивление исправлению этого из опасения нарушить существующие обходные пути, такие как тот, который показан в этом ответе - см. этот ответ к одному из связанных дубликатов для получения справочной информации. - person mklement0; 30.11.2020