我浏览并测试了网上看到的一些例子,但没有成功。 据我了解,它应该类似于下面的代码:
$hookUrl = 'https://discord.com/api/webhooks/XXXXXXXXXXXXXXXXXXXX'
$Body = @{
'username' = $env:username
'content' = "this is a test"
"file=@C:\Users\User\Desktop\test.txt"
}
Invoke-WebRequest -uri $hookUrl -Method POST -Body $Body -Headers @{'Content-Type' = 'application/json'}
错误
Invoke-WebRequest : {"code": 50109, "message": "The request body contains invalid JSON."}
At line:11 char:1
+ Invoke-WebRequest -uri $hookUrl -Method POST -Body $Body -Headers @{' ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
我在文档中看到了一些很长的方法来实现这一目标,但是如果您看到下面的内容,我将发布一个行,它可以使用 CMD 完成我想要的任务。在 CMD 中真的这么简单,但在 powershell 中却需要 15 行以上?
curl -F "payload_json={\"username\": \"jakoby\", \"content\": \"download me\"}" -F "file=@\"C:\Users\User\Desktop\newUser.txt\"" WEB-HOOK
更新:
下面的答案(下一节)解决了您问题的原始形式。
后来发现您正在寻找相当于
curl
命令行的 PowerShell,该命令行使用 multipart/form-data
提交来提交 JSON 并上传本地文件。
curl
命令更详细。
因此,最简单的解决方案可能是简单地从 PowerShell 调用
curl
命令,但请务必使用 curl.exe
明确定位 外部可执行文件,而不是 curl
的 Invoke-WebRequest
别名,即内置于 Windows PowerShell 中(已在 PowerShell (Core) 7+ 中删除)。
# In PowerShell 7.3+, the "\" chars. are *no longer necessary*.
curl.exe -F "payload_json={\`"username\`": \`"jakoby\`", \`"content\`": \`"download me\`"}" -F "file=@\`"C:\Users\User\Desktop\newUser.txt\`"" WEB-HOOK
"
两次:
`
,满足 PowerShell 对双引号字符串的语法要求(如预期)。
'...'
进行整体引用,则可以避免这种需要,但这会阻止将变量值直接嵌入到字符串中。\
,解决有关传递包含逐字 "
字符的参数的长期存在的错误。到外部程序。由于目标 Web 服务需要 JSON,因此您必须先将
$Body
hashtable 转换为 JSON,然后再将其传递给 Invoke-WebRequest
的 -Body
参数,您可以使用 ConvertTo-Json
执行此操作:
Invoke-WebRequest -uri $hookUrl -Method POST -Body (ConvertTo-Json $Body) -Headers @{'Content-Type' = 'application/json'}
强制性的一般警告:对于嵌套更深的对象,您可能需要将
-Depth
参数传递给ConvertTo-Json
以防止数据意外截断 - 请参阅这篇文章。
看来你也想上传本地文件:
由于 Web 服务无法访问您的本地文件系统,因此无法将 本地文件路径 作为 JSON 的一部分传递 - 必须上传本地文件的 内容。
Invoke-WebRequest
文档仅讨论在multipart/form-data
提交上下文中上传本地文件 - 例如,请参阅示例 6。