【问题标题】:Changing Slack CURL call into PowerShell将 Slack CURL 调用更改为 PowerShell
【发布时间】:2018-08-09 23:00:03
【问题描述】:

我正在编写一个从 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

注意 $COLOUR 和 $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 或类似的东西。开箱即用的方法或死。

【问题讨论】:

  • 这是一个语法错误;您在附件中的] 之前缺少}
  • 我知道不需要库,但自定义 cmdlet 与脚本代码没有什么不同...您可以添加一个函数或类似的东西。

标签: json powershell curl slack-api


【解决方案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 来确保条目 mrkdwn_in 的值被序列化为数组.


至于你尝试了什么

您的直接问题(除了 Jeff Zeitlin 在对该问题的评论中指出的缺少的}):您忽略了转义 嵌入 " chars. 在您的多行字符串中。 因此,正如文档主题 Get-Help about_Quoting_Rules 所讨论的那样,您可以使用 `""..." 中嵌入双引号或使用此处字符串 (@"<nl>....<n>"@)。

即使解决了语法问题,您的代码也不会按预期工作,因为 ConvertTo-Json 不会保留 预格式化 attachments 条目中的 JSON,而是将字符串值视为需要转义的字符串 literal;这是一个简单的例子:

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

以上产出:

{
  "foo": "[\n    1, \n    2 \n   ]"
}

【讨论】:

    猜你喜欢
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2021-03-20
    • 2018-02-02
    • 1970-01-01
    • 2016-05-29
    • 2016-10-04
    相关资源
    最近更新 更多