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后调用,无需处理任何转义逻辑:
- 先生成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))
- 直接调用编码后的命令:
pwsh -EncodedCommand $encoded
内容的提问来源于stack exchange,提问作者user12517555
相关产品推荐
相关产品推荐

