簡體   English   中英

Powershell & Curl - 在單引號 JSON 正文中使用變量

[英]Powershell & Curl - Using variables inside single-quoted JSON body

我目前正在嘗試使用 Powershell 和 Curl 在我們的 Zendesk 票務系統中自動創建新用戶。 我遇到的問題是 curl json 主體用單引號括起來,我需要在該主體內引用一個變量。 這是我所擁有的:

$Firstname = "Test"
$Lastname = "User"
$email= 'user@test.org'   
curl.exe https://mydomain.zendesk.com/api/v2/users.json -H "Content-Type: application/json" -X POST -d '{\"user\": {\"name\": \"$Firstname $Lastname\", \"email\": \"$email\"}}' -v -u myuser:mypass

如果我在 json 中輸入常規文本值,這可以正常工作,但是如何讓它識別變量 $Firstname、$Lastname 和 $email?

請嘗試以下操作:

$Firstname = "Test"
$Lastname = "User"
$email= 'user@test.org'   
$json=@"
{\"user\": {\"name\": \"$Firstname $Lastname\", \"email\": \"$email\"}}
"@
curl.exe https://mydomain.zendesk.com/api/v2/users.json -d $json -H 'Content-Type: application/json' -X POST -v -u myuser:mypass

使用雙引號here-string @"<newline>...<newline>"@使指定嵌入的"實例變得容易(不需要為了 PowerShell自己的語法而進行轉義),同時仍然擴展變量引用 - 請參閱在線文檔Get-Help about_Quoting_Rules

您清楚地意識到- 不幸的是 - 額外需要\\ -escape "實例,但只是為了解釋為什么需要這樣做

將參數傳遞給外部程序時,PowerShell 在其自己的解析和插值之后,在連接它們以形成參數列表(單個字符串)以傳遞給外部實用程序時,有條件地將結果參數用雙引號括起來 不幸的是,這可能導致嵌入的"實例被丟棄,可靠地保留它們的唯一方法是\\ -escape 它們 - 請參閱此答案以獲取更多信息。

如果你想用一個普通的雙引號字符串做內聯,你不得不逃離"的PowerShell的情況下,(如`" ),導致尷尬的組合\\`"

"{\`"user\`": {\`"name\`": \`"$Firstname $Lastname\`", \`"email\`": \`"$email\`"}}"

事后思考

Ryan 本人在評論中指出,使用哈希表構建數據,然后使用ConvertTo-Json將其轉換為 JSON 並通過 stdin將其提供給curl是一種避免引用問題的替代方法:

# Create data as PS hashtable literal.
$data = @{ user = @{ name = "$Firstname $Lastname"; email = "$adUsername@mydomain.org" } }

# Convert to JSON with ConvertTo-Json and pipe to `curl` via *stdin* (-d '@-')
$data | ConvertTo-Json -Compress | curl.exe mydomain.zendesk.com/api/v2/users.json -d '@-' -H "Content-Type: application/json" -X POST -v -u myuser:mypass

我認為我們可以使用 here-string 作為 Invoke-RestMethod 的 json 主體,如下所示

$bufferTime = 5
$requestBody = @"
{
"size": 0,
    "aggs": {
    "last_x_min": {
        "filter": {
        "range": {
            "@timestamp": {
            "gte": "now-$($bufferTime)m",
            "lte": "now"
            }
        }
        },
        "aggs": {
        "value_agg": {
            "avg": {
            "field": "time-taken"
            }
        }
        }
    }
    }
}
"@

$esResponse = Invoke-RestMethod -URI http://locahost:9200 -TimeoutSec 15 -Method Post -ContentType 'application/json' -Body $requestBody

這是我用來查詢 Elasticsearch 的腳本。 無需轉義雙引號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM