使用 Invoke-Webrequest SQL 和 Powershell 的顽固符号

Stubborn Ampersand with Invoke-Webrequest SQL & Powershell

当我 运行 powershell 在没有符号的 URL 上使用 invoke-webrequest 时,一切正常。

但是我的 URL 里面有 & 符号。如果我用双引号将它们括起来,它可以在 PowerShell 中运行,但如果我通过我的 SQL 服务器来运行则不行。

尝试获得正确的转义字符组合被证明是一件令人头疼的事情。以下是命令示例:

exec xp_cmdshell 'powershell Invoke-WebRequest -UseBasicParsing -Uri "https://example.com/getfile/12345&i=123" -outfile C:\Downloads\test.txt'

问题出在 &i=123 上的符号。

如果我将 -URI 参数中的 & 符号更改为 "&",则它不起作用。如果我在前面加上肉汁克拉(选项卡上方的小 `),它就不起作用。我也尝试用 %26.

替换它

在这里绞尽脑汁好几个小时。有什么建议吗?

embedded "..."-quoting 添加到 URL,这需要转义为 \"...\":

exec xp_cmdshell 'powershell Invoke-WebRequest -UseBasicParsing -Uri "\"https://example.com/getfile/12345&i=123\"" -outfile C:\Downloads\test.txt'

这是必要的,因为 PowerShell 的 CLI(powershell.exe for Windows PowerShell, pwsh 对于 PowerShell [Core] v6+),当与(隐含的)-Command (-c) 选项一起使用时[1]:

  • 首先删除 "..." 对单个命令行参数的引用...
  • 然后用空格连接剥离的参数,然后 然后 将生成的字符串解释为 PowerShell 命令行 - 此时需要在 URL 周围引用,因为 & 是 PowerShell 元字符。

注:

  • 使用 \" 转义嵌入的 " 字符。在 -Command (-c) 中的 "..." 字符串中 CLI 参数工作稳健 除了从 cmd.exe 调用时,其中存在cmd.exe 元字符,例如 &(在 URL 中很常见,例如在本例中)可以 中断 调用。

  • 在这种情况下,powershell.exe 使用 "^""(原文如此),pwsh.exe 使用 "" - 参见 了解更多信息信息。


[1] 请注意 pwsh 现在默认为 -File,它需要一个 脚本文件 .