String literal di JQ menggunakan PowerShell [duplikat]

Nov 30 2020

Saya tidak bisa mendapatkan literal string JQ untuk bekerja dari Powershell. Misalnya, ini menghasilkan objek JSON yang cantik di Bash, tetapi gagal di 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

Awalnya saya curiga kutipan salah, tetapi Write-Output '{"key":"val"}'hasilnya {"key":"val"}seperti yang saya harapkan.

Saya dapat mengatasinya dengan menulis filter JQ saya ke dalam sebuah file. Menggunakan .NET WriteAllTextmemastikan file dikodekan sebagai UTF-8 tanpa BOM.

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

Saya mencari pendekatan yang lebih gesit untuk membuat prototipe filter JQ dan mengintegrasikannya dalam skrip PowerShell.

Versi: JQ 1.6 untuk win64, PSVersion 5.1.18362.1171

Jawaban

1 Inian Nov 30 2020 at 21:20

Powershell mungkin ingin Anda menghindari tanda kutip ganda di dalam '..'ekspresi. Mencoba

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

atau tepat di bawah karena nama kunci di jqtidak memerlukan kutipan eksplisit

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

Dari jqmanual di bawah - Memanggil jq

Saat menggunakan shell perintah Windows ( cmd.exe) yang terbaik adalah menggunakan tanda kutip ganda di sekitar program jq Anda ketika diberikan pada baris perintah (bukan -f program-fileopsi), tetapi kemudian tanda kutip ganda dalam program jq membutuhkan pelolosan garis miring terbalik.