Powershell&Curl - 在单引号JSON体内使用变量

Rya*_*old 2 powershell json 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
Run Code Online (Sandbox Code Playgroud)

如果我在json中键入常规文本值,这可以正常工作,但是如何让它识别变量$ Firstname,$ Lastname和$ email?

mkl*_*nt0 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
Run Code Online (Sandbox Code Playgroud)

使用双引号here-string @"..."可以轻松指定嵌入式"实例(不需要为了PowerShell 自己的语法而转义),同时仍然在扩展变量引用 - 请参阅在线文档Get-Help about_Quoting_Rules.

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

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

如果你想用一个普通的双引号字符串做内联,你必须逃离"了PowerShell的情况下,(如`"),导致尴尬的组合\`":

"{\`"user\`": {\`"name\`": \`"$Firstname $Lastname\`", \`"email\`": \`"$email\`"}}"
Run Code Online (Sandbox Code Playgroud)

事后的想法:

Ryan自己在评论中指出,使用哈希表来构造数据然后将其转换为JSON ConvertTo-Jsoncurl 通过stdin将其提供给它是另一种避免引用头痛的方法:

# 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
Run Code Online (Sandbox Code Playgroud)