You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pwsh -Command执行Invoke-Sqlcmd恢复RDS数据库出现语法错误如何解决

报错原因
  • 核心是多进程调用PowerShell时的引号解析层级冲突:直接在PowerShell会话中执行命令时,-Query参数外层的单引号会保护内部的双引号原样传递给SQL,生成的SQL语法合法。
  • 当使用pwsh -Command "& { ... }调用时,整个执行块被外层双引号包裹,PowerShell会先完成一次外层双引号内的字符解析,直接剥离-Query内部的双引号,最终传递给SQL的语句中ARN参数没有字符串包裹符,不符合SQL语法规范,触发Incorrect syntax near 'arn:'报错。
修复方案

方案1:双引号转义(改动最小)

将-Query内部的每个双引号替换为两个双引号,确保外层解析后双引号仍能保留:

pwsh -Command "& {Invoke-Sqlcmd -Query 'exec msdb.dbo.rds_restore_database @s3_arn_to_restore_from=""arn:aws:s3:::XXX/XX/XXX.bak"",@restore_db_name=mydatabase' -ServerInstance XXXXX.eu-west-1.rds.amazonaws.com -Database master -Username XXX -Password XXX}"

方案2:替换SQL字符串包裹符(兼容性更好)

SQL原生支持单引号包裹字符串,你可以调整引号嵌套规则,避免多层双引号冲突:

pwsh -Command "& {Invoke-Sqlcmd -Query ""exec msdb.dbo.rds_restore_database @s3_arn_to_restore_from='arn:aws:s3:::XXX/XX/XXX.bak',@restore_db_name=mydatabase"" -ServerInstance XXXXX.eu-west-1.rds.amazonaws.com -Database master -Username XXX -Password XXX}"

方案3:编码调用(彻底规避转义问题)

如果命令复杂度高、嵌套层级多,可以将执行代码编码为Base64后调用,无需处理任何转义逻辑:

  1. 先生成Base64编码的命令:
$execCode = @'
Invoke-Sqlcmd -Query 'exec msdb.dbo.rds_restore_database @s3_arn_to_restore_from="arn:aws:s3:::XXX/XX/XXX.bak",@restore_db_name=mydatabase' -ServerInstance XXXXX.eu-west-1.rds.amazonaws.com -Database master -Username XXX -Password XXX
'@
$encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($execCode))
  1. 直接调用编码后的命令:
pwsh -EncodedCommand $encoded

内容的提问来源于stack exchange,提问作者user12517555

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:24:02