Powershell&卷曲 - 在单引号JSON体

时间:2016-03-15 05:55:45

标签: json powershell curl

我目前正在尝试使用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?

2 个答案:

答案 0 :(得分:6)

尝试以下方法:

$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 @"..."可以轻松指定嵌入式"实例(不需要为了PowerShell的自己的语法而转义),同时仍在扩展变量参考文献 - 请参阅docs onlineGet-Help about_Quoting_Rules

您清楚地意识到\的额外需求 - 逃避"个实例,只是为了解释为什么需要这样做:

将参数传递给外部实用程序,PowerShell,在自己的解析和插值之后,有条件地将结果参数包装在双引号中将它们连接起来形成要传递给外部实用程序的参数列表(单个字符串)。不幸的是,这可能导致嵌入式 "实例被丢弃,并且可靠地保存它们的唯一方法是\ - 逃避它们。

如果您想使用常规双引号字符串内联,则必须转义PowerShell "个实例(作为`"),导致尴尬的组合\`"

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

有感

Ryan自己在评论中指出使用散列表 构建数据,然后使用 ConvertTo-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

答案 1 :(得分:0)

我认为我们可以使用here-string作为Invoke-RestMethod的json body,如下所示

$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的脚本。无需逃避双引号。