我正在嘗試使用 JSON 字串作為引數在 Powershell 7 中運行 AWS CLI。AWS 檔案讓它看起來很簡單:
aws route53 ... --change-batch '{"Changes":[{"Action":"UPSERT"}]}'
但是,我收到一個錯誤:
決議引數“--change-batch”時出錯:JSON 無效:期望用雙引號括起來的屬性名稱:第 1 行第 2 列(字符 1)收到的 JSON:{Changes:[{Action:UPSERT ...
因此,看起來雙引號在某些時候被剝離了。
如果我轉義引號,命令有效:
aws route53 ... --change-batch '{\"Changes\":[{\"Action\":\"UPSERT\"}]}'
現在,我正在嘗試使用一個變數:
aws route53 ... --change-batch '{\"Changes\":[{\"Action\":\"UPSERT\", \"Value\":\"$MY_IP\"}]}'
但變數未決議;也$MY_IP就是傳遞給服務器。我嘗試將整個字串放在雙引號中 - 但即使我轉義它們,雙引號內部引號也會被洗掉。還帶有反引號 - 它用作命令延續。我正在查看Microsoft 檔案- 但我得到的結果明顯不同。
我認為這個問題與 AWS 無關,但是 AWS CLI 給了我一個超級扭曲的測驗用例。
uj5u.com熱心網友回復:
從根本上說,PowerShell 僅在雙引號字串 (
"...") 中執行字串插值,也稱為可擴展字串:請參閱此答案。\顯式轉義嵌入"字符的令人驚訝和不幸的需要。無論您使用哪種參考樣式,外部程式的in arguments都適用,至少 PowerShell 7.2.x:請參閱此答案。
因此,由于您需要一個"..."用于字串插值的字串(以便將變數參考$MY_IP擴展到其值),因此您需要對 embedded 進行兩層轉義":
`"(或"")為了滿足 PowerShell 的語法要求......并且這個轉義序列必須另外轉義,
\以便外部程式能夠看到嵌入"的內容。
所以:
# Inside "...", pass-through " must be escaped as \`" (sic)
aws route53 ... --change-batch "{\`"Changes\`":[{\`"Action\`":\"`UPSERT\`", \`"Value\`":\`"$MY_IP\`"}]}"
您可以在(可擴展的) here-string的幫助下減輕痛苦,這避免了"為了PowerShell而逃避嵌入的需要:
# A here-string obviates the need to escape " for PowerShell's sake.
aws route53 ... --change-batch @"
{\"Changes\":[{\"Action\":\"UPSERT\", \"Value\":\"$MY_IP\"}]}
"@
\另一種選擇是在事后以編程方式執行-escaping:
aws route53 ... --change-batch (@"
{"Changes":[{"Action":"UPSERT", "Value":"$MY_IP"}]}
"@ -replace '"', '\"')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/490711.html
標籤:电源外壳 变量 字符串插值 powershell-7.0
上一篇:重置組織單位的密碼
