您好,我在使用 Invoke-VMScript cmdlet 时遇到了一些问题,我制作了一个脚本来创建虚拟 Windows 7 机器,然后在机器上执行一些 powershell 脚本,例如将计算机重命名为正确的名称。
但如果我跑
Invoke-VMScript -ScriptText {(Get-Wmiobject -Class Win32_ComputerSystem).Rename($strName)}
$strName 变量没有得到解决,有人知道如何做到这一点吗?
您好,我在使用 Invoke-VMScript cmdlet 时遇到了一些问题,我制作了一个脚本来创建虚拟 Windows 7 机器,然后在机器上执行一些 powershell 脚本,例如将计算机重命名为正确的名称。
但如果我跑
Invoke-VMScript -ScriptText {(Get-Wmiobject -Class Win32_ComputerSystem).Rename($strName)}
$strName 变量没有得到解决,有人知道如何做到这一点吗?
我没有方便重命名的客人,但在LucD 之后,这是一个使用变量为 scriptText 建立输入的工作示例:
$svcName = "vmtools"
$guestScript = 'get-wmiObject win32_service | where {$_.name -eq "' + $svcName + '"}'
Invoke-VMScript -vm myVMname -scriptText $guestScript
#Rename Computer command line script
$renamecomputer = "wmic path win32_computersystem where ""Name='%computername%'"" CALL rename name='$VM'"
#Send command line script to GuestOS
Invoke-VMScript -VM $VM -GuestUser $GU -GuestPassword $GP -ScriptType Bat -ScriptText $renamecomputer
这就是我用于重命名脚本的内容。效果很好
我得到了这个工作:
Invoke-VMScript -VM $vm -ScriptText "(Get-WmiObject win32_computersystem).rename(""${vmName}"")"
您没有正确确定变量的范围。这是一个可以在控制台中尝试的简单实验:
PS C:\> $test = "Resolve!"
PS C:\> $test
Resolve!
# This scriptblock will not resolve the variable.
PS C:\> {$test}
$test
# This scriptblock will resolve the variable.
PS C:\> [scriptblock]::Create($test)
Resolve!
Invoke-VMScript 的文档建议您应该-ScriptText
作为字符串而不是ScriptBlock 传递。所以在这种情况下,我们可以模仿示例 2:
$string = "(Get-Wmiobject -Class Win32_ComputerSystem).Rename($strName)"
Invoke-VMScript -ScriptText $string
包含的变量" "
将被解析。