繁体   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