PowerShell脚本如何上传XML文件 Invoke-RestMethod怎么用

必须用 -InFile 上传 XML 文件,配合 -Headers 指定 Content-Type,不可用 -Body;因 -Body 会触发自动序列化和编码转换,导致格式丢失、乱码或服务端拒收。

上传XML文件必须用 -InFile,不能靠 -Body

PowerShell 的 Invoke-RestMethod 本身不支持直接把 XML 字符串当 -Body 发送并自动设对 Content-Type——它会默认用 application/json 或空类型,后端通常直接拒收。真正可靠的方式是让 PowerShell 把文件二进制原样发出,并手动指定头。

  • -InFile 参数会以原始字节流读取文件

    ,跳过任何编码/序列化逻辑,适合 XML、PDF、ZIP 等非文本格式
  • 必须显式加 -Headers @{ "Content-Type" = "text/xml" }(或 application/xml,看 API 要求)
  • 如果 XML 文件含 BOM 或编码声明(如 ),确保文件实际保存为对应编码(通常是 UTF-8 无 BOM)

Invoke-RestMethod 上传 XML 的最小可行命令

假设你要向 https://api.example.com/upload POST 一个本地 data.xml

Invoke-RestMethod -Uri "https://api.example.com/upload" `
  -Method Post `
  -InFile ".\data.xml" `
  -Headers @{ "Content-Type" = "text/xml" } `
  -Credential $cred

注意几点:

  • -InFile 值必须是**绝对路径或相对于当前工作目录的相对路径**;用 Get-Location 确认当前路径,或改用 Join-Path $PSScriptRoot "data.xml"
  • -Credential 非必需,但多数生产 API 需认证;若用 API Key,换成 -Headers @{ "Authorization" = "Bearer abc123" }
  • 不要加 -ContentType 参数——它和 -InFile 冲突,会被忽略;只用 -Headers 设 Content-Type

为什么不用 [xml] 类型 + -Body

有人试过先用 [xml]$xml = Get-Content file.xml 再转成字符串传 -Body,这会导致三类问题:

  • XML 对象序列化后丢失缩进、注释、处理指令(如
  • PowerShell 默认用 UTF-16 编码字符串,而 HTTP body 没有编码声明,服务端常按 UTF-8 解析 → 出现乱码或解析失败
  • -Body 会触发 ConvertTo-Json 式自动转换逻辑(即使你传的是字符串),可能额外转义 \u003c

结论:只要文件存在磁盘,就别读进内存再发;-InFile 是唯一干净路径。

调试时怎么确认发出去的就是原 XML?

最直接的方法是用 curl 对比(PowerShell 7+ 自带):

curl -X POST https://api.example.com/upload `
  -H "Content-Type: text/xml" `
  -d "@./data.xml" 

如果 curl 成功而 Invoke-RestMethod 失败,大概率是:

  • PowerShell 版本太老(-InFile,必须升级或换 Invoke-WebRequest
  • 目标 URL 用了 HTTPS 但服务器证书不受信 → 加 -SkipCertificateCheck(仅测试环境)
  • XML 文件路径错、权限不足、或被杀毒软件锁定

真正的坑往往不在语法,而在路径、编码、证书这三处——发之前先 Test-Path .\data.xmlGet-Content .\data.xml -Encoding UTF8 -TotalCount 3 看开头是否正常。