PowerShell:转义传递给外部程序的字符串中双引号的最佳方法?例如,JSON字符串

wztqucjr  于 2023-02-10  发布在  Shell
关注(0)|答案(2)|浏览(138)

我读了所有关于PowerShell中转义字符串的文章,但我仍然没有找到令我满意的解决方案。
假设我有一个包含JSON字符串的文件foo.json,我需要将JSON字符串作为参数传递给程序。
在bash中,这样做很好:
myprogram "$(cat ~/foo.json)"
在PowerShell中,当我正常读取文件的内容并将其传入时,接收程序会抱怨键和值周围没有引号。
我得出的结论是:
$json = (get-content ~/foo.json | Out-String) -replace '"','""' myprogram $json
在PowerShell中有没有一种不那么笨拙的方法可以做到这一点?我已经采取了退出会话,在bash中运行命令,然后再次启动会话的方法。

djp7away

djp7away1#

遗憾的是,PowerShell将带有嵌入式双引号的参数传递给 * 外部程序 * 的功能至少在 PowerShell 7.2版本中被分解,需要您*手动将其 * \-转义\"

  • 有关潜在问题的更多信息,请参见this answer
    可靠的解决方法不仅要求将所有"替换为\",而且要求将它们前面的任何\加倍。
# Note: If your JSON has no embedded *escaped* double quotes
#       - \" - you can get away with: -replace '"', '\"'
myprogram ((Get-Content -Raw ~/foo.json) -replace '([\\]*)"', '$1$1\"')

注意使用了Get-Content -Raw,它比Get-Content ... | Out-String更适合将整个文件读入一个 * 单个 *、多行的字符串,但注意它需要PSv 3+。

  • 假设您的JSON根本不包含转义序列,或者只包含\" * 的示例,Vivere发现了一个更简单的解决方法,即通过ConvertTo-Json将JSON字符串再次编码为JSON**:
# Works, but only if your JSON contains no escape sequences
# such as \n or \\
myprogram (Get-Content -Raw ~/foo.json | ConvertTo-Json)
8aqjt8rx

8aqjt8rx2#

在我的例子中,我在调用参数之前用单引号替换了所有的双引号,并且在开头和结尾都设置了双引号。
在我的场景中,我从groovy调用Powershell。
changeorderParam是我的Json字符串所在的位置。

更改命令参数=更改命令参数.replaceAll(“",”“)bat“powershell.exe -执行策略绕过-文件C:\scripts\script.ps1 "${模板}\”"${脚本}\”"${分支}\”"${更改命令参数}"”

我希望这能帮助到一些人!

相关问题