微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在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 正文 (-d) 和标题 (-H) 需要从文件中读取,因此 @ 位于文件名之前。

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

  • 用单引号括起来
  • 此处为文档 (@" "@)
  • 这里是字符串 (@' '@)
  • 使用带有占位符的字符串模板 ("{0}request.txt" -f "@")
  • Unicode 转义符 ("`u{0040}request.txt")

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

解决方法

Invoke-Expression (iex) should generally be avoided;绝对don't use it to invoke an external program or PowerShell script

因此:

  • 直接调用 curl
  • quote PowerShell 元字符,例如 @(请参阅 this answer 以获取完整列表) - 单独 ,使用 `(例如 `@),或将整个参数括在引号中('...'"...",视情况而定)。
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 的预先解析“吃掉”,基于概念中解释的转义规则about_Quoting_Rules 帮助主题:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。