将Slack的CURL调用转换为PowerShell遇阻求助
用PowerShell的Invoke-WebRequest替代Slack通知的curl命令
我之前也踩过把Slack Bash脚本转PowerShell的坑,核心问题就是PowerShell和Bash在字符串处理、JSON构造上的规则差异。先把场景理清楚:
你原Bash里能正常运行的curl命令应该是类似Slack Webhook的标准请求:
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"*$COLOUR* $MESSAGE\"}" https://hooks.slack.com/services/XXX/XXX/XXX
而你转换的PowerShell代码大概率因为转义或变量解析逻辑的问题报错,比如你可能写了这样的代码:
Invoke-WebRequest -Method Post -ContentType 'application/json' -Body "{\"text\":\"*$COLOUR* $MESSAGE\"}" -Uri https://hooks.slack.com/services/XXX/XXX/XXX
这个写法的问题在于PowerShell的转义规则和Bash完全不同——PowerShell用**反引号**而非反斜杠`来转义双引号,而且手动构造JSON很容易出现格式漏洞。下面给你两个靠谱的解决方案:
方案1:用ConvertTo-Json构造请求体(推荐)
这个方法彻底规避手动转义的麻烦,先把内容存入哈希表,再转换成标准JSON:
# 直接用变量定义要发送的内容,无需手动转义 $slackContent = @{ text = "*$COLOUR* $MESSAGE" } # 把哈希表自动转换成符合规范的JSON字符串 $jsonPayload = $slackContent | ConvertTo-Json # 发送请求到Slack Webhook Invoke-WebRequest -Uri "https://hooks.slack.com/services/XXX/XXX/XXX" ` -Method Post ` -ContentType "application/json" ` -Body $jsonPayload
这个方法的优势在于,不管$COLOUR和$MESSAGE里包含什么特殊字符(只要不是极端破坏JSON的情况),ConvertTo-Json都会自动处理转义,完全避免格式错误。
方案2:手动构造JSON字符串(适合简单场景)
如果你一定要手动编写JSON,记得遵循PowerShell的转义规则——用反引号`转义双引号:
# 注意这里的双引号是用反引号`转义,而非Bash里的反斜杠 $manualPayload = "{`"text`":`"*$COLOUR* $MESSAGE`"}" Invoke-WebRequest -Uri "https://hooks.slack.com/services/XXX/XXX/XXX" ` -Method Post ` -ContentType "application/json" ` -Body $manualPayload
常见错误排查
如果还是报错,可以先检查这几点:
- 先输出
$jsonPayload或$manualPayload,确认生成的JSON格式是否正确,有没有语法错误 - 验证
$COLOUR和$MESSAGE变量是否已经正确赋值,没有空值或非法字符 - 如果遇到SSL证书错误(比如内网环境),PowerShell 6+可以添加
-SkipCertificateCheck参数跳过验证(生产环境谨慎使用)
内容的提问来源于stack exchange,提问作者Scott Shorkey
相关产品推荐
相关产品推荐

