我目前正在尝试使用 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 自己的语法而进行转义),同时仍然扩展变量引用 - 参见 docs online或 Get-Help about_Quoting_Rules
.您清楚地知道 - 不幸 - 额外需要
\
-逃离"
实例 ,但只是为了解释为什么需要这样做:当将参数传递给外部程序 , PowerShell 在它自己的解析和插值之后,在连接它们以形成要传递给外部实用程序的参数列表(单个字符串)时,有条件地将结果参数包装在双引号中。不幸的是,这可能导致嵌入
"
实例被丢弃,可靠地保存它们的唯一方法是 \
- 逃离他们 - 见 this answer想要查询更多的信息。如果你想用一个普通的双引号字符串来内联,你必须转义
"
PowerShell 的实例(如 `"
),导致尴尬的组合 \`"
:"{\`"user\`": {\`"name\`": \`"$Firstname $Lastname\`", \`"email\`": \`"$email\`"}}"
事后思考:
瑞安本人在评论中指出 使用哈希表 构建数据,然后使用 将其转换为 JSON
ConvertTo-Json
并将其喂给 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 - Powershell & Curl - 在单引号 JSON 正文中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36003647/