[英]correct syntax for putting a powershell script into a variable with double quotes
我需要像这样将 PowerShell 脚本放入带有双引号的变量中。 但是我不知道正确的语法,因为我在尝试此操作时看到 $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
Invoke-VMScript -ScriptText
仅接受包含 PowerShell 代码的字符串,并且不支持单独将arguments传递给该代码。
其含义是:
为了包含来自调用者的 scope 的变量值,您确实需要使用字符串插值(通过可扩展字符串, "..."
),正如您所尝试的那样。
"... -Foo '$foo'..."
) 正如Mathias R. Jessen指出的那样,您想要在目标机器上评估的变量引用必须将其$
sigil 转义为`$
以防止调用方过早插值; 例如`$Using:sqluser
但是,有一个问题:
字符串插值的使用对可以嵌入到字符串中的数据类型施加了限制,因为并非所有数据类型都具有被识别为原始类型的字符串文字表示。
在您的情况下,调用方$cred
变量包含一个[PSCredential]
实例,它没有有意义地进行字符串化(并且出于安全原因不能):它毫无意义地扩展为System.Management.Automation.PSCredential
的逐字字符串值,即实例的类型名称。
换句话说:您不能以这种方式传递凭据。
一个潜在的解决方法需要在目标机器上进行前期工作:您可以尝试将凭据以加密形式保存到文件中,然后在调用时通过Import-Clixml
反序列化该文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.