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
相关产品推荐
相关产品推荐

