2

我需要将 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 
4

1 回答 1

2

Invoke-VMScript -ScriptText仅接受包含 PowerShell 代码的字符串,并且支持单独将参数传递给该代码。

影响是:

  • 为了包含调用者范围内的变量值,您确实需要使用字符串插值(通过可扩展的字符串, "..."),正如您所尝试的那样。

    • 请注意,这在某些情况下需要对调用者变量的引用进行嵌入引用,这些变量的值可能包含空格或其他特殊字符;例如
      "... -Foo '$foo' ..."
  • 正如Mathias R. Jessen所指出的,要在目标机器上评估的变量引用必须将其$符号转义,`$以防止调用方过早插值;例如`$Using:sqluser

但是有一个问题

  • 字符串插值的使用对可以嵌入到字符串中的数据类型施加了限制,因为并非所有数据类型都具有被识别为原始类型的字符串文字表示。

    • 在您的情况下,调用方$cred变量包含一个[PSCredential]实例,该实例没有进行有意义的字符串化(出于安全原因也不能):它毫无意义地扩展为 的逐字字符串值System.Management.Automation.PSCredential,即实例的类型名称
      换句话说:您不能以这种方式传递凭据

    • 一个潜在的解决方法需要在目标机器上进行前期工作:您可以尝试将凭据以加密形式保存到文件中,然后在调用时通过Import-Clixml.

      • 有关演示,请参阅此答案有关此方法的安全含义,请参阅此答案。
于 2021-10-06T16:09:32.607 回答