将Slack CURL调用更改为PowerShell

时间:2018-03-01 19:13:45

标签: json powershell curl slack-api

我正在编写一个从Bash到Powershell的工作Slack脚本的翻译,我偶然发现了问题的根源。如何使用Invoke-WebRequest替换curl。

这是在* nix系统上的Bash中成功运行的curl命令:

curl \
-X POST \
-H "Content-type: application/json" \
--data "{
   \"attachments\": 
   [
      {
         \"mrkdwn_in\": [\"text\"],
         \"color\": \"$COLOUR\",
         \"text\": \"$MESSAGE\",
      }
   ]
}" \
https://hooks.slack.com/services/tokenpart1/tokenpart2

注意$ COLOR和$ MESSAGE变量是从脚本中的其他地方派生的(而不是我遇到问题的部分)。

我无法在PowerShell中使用它。到目前为止我的翻译是:

$Body = @{
   "attachments" = "[
      {
         "mrkdwn_in": ["text"],
         "color": "$Colour",
         "text": "$Message",

   ]"
}

$BodyJSON = $Body |convertto-JSON

Invoke-WebRequest -Headers -Method Post -Body "$BodyJSON" -Uri "https://hooks.slack.com/services/tokenpart1/tokenpart2" -ContentType application/json

这会导致以下错误:

At C:\path-to-file-etc.ps1:53 char:11
+          "mrkdwn_in": ["text"],
+           ~~~~~~~~~~~~~~~~~~~~~
Unexpected token 'mrkdwn_in": ["text"],
         "color": "$COLOUR",
         "text": "$MESSAGE",
      }
   ]"' in expression or statement.
At C:\path-to-file-etc.ps1:53 char:11
+          "mrkdwn_in": ["text"],
+           ~
The hash literal was incomplete.At 
C:\path-to-file-etc.ps1:53 char:11
+          "mrkdwn_in": ["text"],
+           ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordEx 
   ception
    + FullyQualifiedErrorId : UnexpectedToken

Process exited with code 1
Process exited with code 1
Step Notify (PowerShell) failed

我在Powershell中几乎没有任何经验。另外,因为这个脚本必须能够放到各种各样的盒子上,我不会使用任何库或自定义cmdlet或类似的东西。开箱即用方法或死亡。

1 个答案:

答案 0 :(得分:1)

由于您无论如何都在使用ConvertTo-Json,因此整个输入构建为(嵌套的)自定义对象/哈希表更简单,并让ConvertTo-Json处理所有JSON格式

$Body = [pscustomobject] @{
  attachments = , [pscustomobject] @{
    mrkdwn_in = , 'text'
    color = $Colour
    text = $Message
  }
}

$BodyJson = $Body | ConvertTo-Json -Depth 3

注意:您可以用[ordered]代替[pscustomobject]来使用带有有序键的哈希表;即使省略其中任何一个都会起作用,尽管以不同的顺序查看生成的JSON中的条目可能会令人困惑。

注意使用数组构造运算符,来确保将attachmentsmrkdwn_in条目视为数组。

此外,由于 ConvertTo-Json仅完全序列化为2级别的默认深度,因此必须使用-Depth 3来确保条目{{}的值1}}被序列化为数组。

至于您尝试的内容

您的 立即问题(除了Jeff Zeitlin在对该问题的评论中指出的遗漏mrkdwn_in之外):您&#39 ; ve忽略了转义 嵌入 }字符。在您的多行字符串中。 因此,正如文档主题Get-Help about_Quoting_Rules所述,您可以使用"`"中嵌入双引号,也可以使用here-string("...")。

即使修复了语法问题,您的代码也无法按预期工作,因为 @"<nl>....<n>"@不会保留ConvertTo-Json条目中的-formatted JSON ,而是将字符串值视为需要转义的字符串 literal ;这是一个简单的例子:

attachments

以上产量:

@{ 
    foo = "[
      1, 
      2 
    ]"
 } | ConvertTo-Json