我编写了一个PowerShell脚本来启动/停止VM,如下所示:$vma
是VM的名称。
$vmstate = (vboxmanage showvminfo $vma --machinereadable | % { if ($_ -like 'VMState="*"') { $_ } })
Write-Host $vmstate
if ($vmstate -like '*run*') {
Write-Host "Wait while "$vma" is powered off (saving state)"
vboxmanage controlvm $vma savestate
}
else {
Write-Host "Wait while "$vma" is started"
vboxmanage startvm $vma
}
每次启动VM都可以正常工作。保存状态也可以,但是会在PS ISE输出窗口中显示此错误:
Wait while W2008_21_06_A is powered off (saving state) vboxmanage : 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% At C:\Users\craig\My Documents\vbox.ps1:18 char:5 + vboxmanage controlvm $vma savestate + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (0%...10%...20%....0%...90%...100%:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError
我得到的印象是,它在VBoxManage算出结果之前已经保存了状态。有任何想法吗?
我的系统规格:
最佳答案
您的“问题”是,您在ISE中使用PowerShell。尝试直接使用PowerShell。区别?首先有两个奇怪的事情:
savestate
的vboxmanage
参数时,成功时的输出(0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
)被写入stderr
(而不是stdout
,这是更合适的imo)。 stderr
写入,则ISE会引发异常。 PowerShell不会这样做。 总之,ISE已在实际成功消息上引发错误,因为它已被写入
stderr
。您可以通过使用Start-Process
cmdlet运行外部程序来防止此行为。您可以通过以下方式替换对VBoxManage.exe的调用Start-Process "C:\Program Files\Oracle\VirtualBox\vboxmanage.exe" -ArgumentList "controlvm `"$vma`" savestate"
和
Start-Process "C:\Program Files\Oracle\VirtualBox\vboxmanage.exe" -ArgumentList "startvm `"$vma`""
关于powershell - Powershell脚本可以保存VirtualBox VM的状态,但每次都会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47239275/