在SSMS中通过xp_cmdshell执行PowerShell代码报错如何解决?
报错原因
- CMD特殊字符解析冲突:xp_cmdshell会先把命令交给系统CMD环境解析,URL中的
&是CMD的默认命令分隔符,会被直接拆分为两个命令执行,因此&后的appid部分会被当成独立命令触发不存在的报错。 - 语法拼接疏漏:你拼接PowerShell命令时,URL的结束引号和
-UseBasicParsing参数之间没有空格,多层转义后触发了PowerShell的引号匹配异常,导致缺少结束符的报错。
修复方案
调整两点即可:
- 把URL中的
&替换为CMD转义格式^&,避免CMD提前拆分命令 - 给URL结束引号后加空格,和后续参数分开,同时用双引号把整个PowerShell执行块包裹避免转义混乱
修正后可正常运行的代码如下:
declare @url varchar(250) = 'https://samples.openweathermap.org/data/2.5/weather?q=London,uk^&appid=439d4b804bc8187953eb36d2a8c26a02' declare @c varchar(1000) = N'powershell.exe -noprofile -executionpolicy bypass ' + N'-command "(Invoke-WebRequest -Uri '''+@url+''' -UseBasicParsing).content"' print @c exec xp_cmdshell @c
如果后续遇到更复杂的命令转义问题,可以直接把PowerShell命令编码为UTF-16LE的Base64字符串,使用-EncodedCommand参数传入,完全规避多层环境的转义冲突。
内容的提问来源于stack exchange,提问作者Dave Pa
相关产品推荐
相关产品推荐

