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

PowerShell脚本存入双引号包裹变量的正确语法是什么

错误原因

语法报错的核心原因是双引号嵌套冲突:外层已经用双引号包裹整个脚本字符串,内层invoke-sqlcmd参数里的双引号会被PowerShell识别为外层字符串的结束符,导致语法解析错误。

正确实现方案

根据你的使用场景选择对应写法:

场景1:定义$script时就将本地$hostname、$sqluser等变量的值直接写入脚本字符串(适合传给Invoke-VMScript在虚拟机内执行的场景)

用两个连续双引号转义字符串内部的双引号即可:

$script = "Invoke-Command -ComputerName $hostname -Credential $cred -ScriptBlock {Import-Module sqlserver; invoke-sqlcmd -ServerInstance $hostname\MSSQLServer; invoke-sqlcmd ""create login [$sqluser] from windows"";invoke-sqlcmd ""alter server role sysadmin add member [$sqluser]""}"

$runscript = Invoke-VMScript -VM $vm -ScriptText $script -GuestUser $tmpl_user -GuestPassword $tmpl_pass -ToolsWaitSecs 300 

注:此场景下不要用$Using:前缀,虚拟机内执行的脚本无法读取你本地机器的变量,直接在本地将变量值插入脚本字符串即可。

场景2:定义$script时不展开变量,留到脚本执行时再解析

外层改用单引号包裹整个脚本字符串,内部的双引号不需要额外转义:

$script = 'Invoke-Command -ComputerName $hostname -Credential $cred -ScriptBlock {Import-Module sqlserver; invoke-sqlcmd -ServerInstance $Using:hostname\MSSQLServer; invoke-sqlcmd "create login [$Using:sqluser] from windows";invoke-sqlcmd "alter server role sysadmin add member [$Using:sqluser]"}'

$runscript = Invoke-VMScript -VM $vm -ScriptText $script -GuestUser $tmpl_user -GuestPassword $tmpl_pass -ToolsWaitSecs 300 

注:此场景要求$hostname、$cred等变量在脚本执行的环境(即虚拟机内部)中已提前定义。


内容的提问来源于stack exchange,提问作者1JS1-2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:45:03