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?


尝试以下操作:

$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自己的语法需要进行转义),同时仍然可以扩展变量引用 - 请参阅联机文档或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

我想我们可以在这里使用这个字符串作为json主体的Invoke-RestMethod,如下所示

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

链接地址: http://www.djcxy.com/p/8559.html

上一篇: Powershell & Curl

下一篇: Sending Json Data to another server USING cURL