我读了所有关于PowerShell中转义字符串的文章,但我仍然没有找到令我满意的解决方案。
假设我有一个包含JSON字符串的文件foo.json
,我需要将JSON字符串作为参数传递给程序。
在bash中,这样做很好:myprogram "$(cat ~/foo.json)"
在PowerShell中,当我正常读取文件的内容并将其传入时,接收程序会抱怨键和值周围没有引号。
我得出的结论是:$json = (get-content ~/foo.json | Out-String) -replace '"','""' myprogram $json
在PowerShell中有没有一种不那么笨拙的方法可以做到这一点?我已经采取了退出会话,在bash中运行命令,然后再次启动会话的方法。
2条答案
按热度按时间djp7away1#
遗憾的是,PowerShell将带有嵌入式双引号的参数传递给 * 外部程序 * 的功能至少在 PowerShell 7.2版本中被分解,需要您*手动将其 *
\
-转义为\"
:可靠的解决方法不仅要求将所有
"
替换为\"
,而且要求将它们前面的任何\
加倍。注意使用了
Get-Content -Raw
,它比Get-Content ... | Out-String
更适合将整个文件读入一个 * 单个 *、多行的字符串,但注意它需要PSv 3+。\"
* 的示例,Vivere发现了一个更简单的解决方法,即通过ConvertTo-Json
将JSON字符串再次编码为JSON**:8aqjt8rx2#
在我的例子中,我在调用参数之前用单引号替换了所有的双引号,并且在开头和结尾都设置了双引号。
在我的场景中,我从groovy调用Powershell。
changeorderParam是我的Json字符串所在的位置。
更改命令参数=更改命令参数.replaceAll(“",”“)bat“powershell.exe -执行策略绕过-文件C:\scripts\script.ps1 "${模板}\”"${脚本}\”"${分支}\”"${更改命令参数}"”
我希望这能帮助到一些人!