如何在 PowerShell 的字符串中转义 @?

How to escape @ within a string in PowerShell?

我正在尝试通过 PowerShell 中的 cURL 发送 HTML 请求。有问题的代码:

$command = 'curl -d @request.txt -o testoutput.xml -X "POST" -H @header.txt -u "username:password" "URL"'
Invoke-Expression $command

HTML Body (-d) 和 Header (-H) 需要从文件中读取,因此文件名前有 @。

为了让它工作,我需要转义 @ 以便 PowerShell 不会将其解释为 splat 运算符 - 这就是我的问题,到目前为止我没有尝试任何工作:

如何正确转义@?还是我完全走错了路? (抱歉,我是 PowerShell 的新手)

; definitely .

因此:

  • 直接调用curl
  • 引用 PowerShell 元字符 例如 @(完整列表请参阅 )- 单独 ,与 `(例如,`@),或将整个参数括在引号中('...'"...",如合适)。
curl -d `@request.txt -o testoutput.xml -X "POST" -H @header.txt -u "username:password" "URL"

至于你试过的

关于 Invoke-Expression 使用的主要问题是 安全性 之一:不希望执行的(附加)命令可能会注入到传递给它的字符串中。

功能而言,Invoke-Expression不仅不需要定期调用外部程序,它可以创建引述头痛.

但是,假设您将 '...' 字符串传递给 Invoke-Expression,将 @ 引用为 `@ 会起作用,如这个简单示例所示:

# OK, but generally do NOT do this.
Invoke-Expression 'Write-Output `@'

如果您使用 "..." 字符串,` 会被这样的 expandable string, based on the escaping rules explained in the conceptual about_Quoting_Rules 帮助主题的前期解析“吃掉”:

# BREAKS, because the ` is stripped before Invoke-Expression sees it.
Invoke-Expression "Write-Output `@"