PowerShellを使用したJQの文字列リテラル[重複]

Nov 30 2020

PowershellからJQ文字列リテラルを機能させることができません。たとえば、これはBashできれいなJSONオブジェクトを出力しますが、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フィルターをファイルに書き込むことで回避できます。.NETWriteAllTextを使用すると、ファイルはBOMなしで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スクリプトに統合するためのより機敏なアプローチを探しています。

バージョン:win64用のJQ 1.6、PSVersion 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)を使用する場合、コマンドラインで指定する-f program-file場合は(オプションではなく)jqプログラムを二重引用符で囲むのが最善ですが、jqプログラムで二重引用符を使用するには円記号をエスケープする必要があります。