我编写了一个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输出窗口中显示此错误。
等待W2008_21_06_A关机(保存状态)vboxmanage: 0%... 10%... 20%... 30%... 40%... 50%... 60%... 70%... 80%... 90%... 100%在 C:\ Users \ craig \ My Documents \ vbox.ps1:18 char:5 + vboxmanage controlvm $ vma savestate + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:未指定:(0%... 10%... 20%.... 0%... 90%... 100%:字符串)[],RemoteException + FullyQualifiedErrorId:NativeCommandError
我得到的印象是它已经在VBoxManage计算出结果之前保存了状态!?!
有什么想法吗?
此致
克雷格
答案 0 :(得分:1)
您的“问题”是,您在ISE中使用PowerShell。尝试直接使用PowerShell。区别?首先有两个奇怪的事情:
savestate
的{{1}}参数时,成功的输出(vboxmanage
)将被写入0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
(而不是stderr
)更合适的imo)。stdout
,则ISE会引发异常。 PowerShell不会这样做。最后,由于ISE已写入stderr
,因此ISE在实际的成功消息上引发错误。您可以通过使用stderr
cmdlet运行外部程序来防止此行为。您可以通过以下方式替换对VBoxManage.exe的调用:
Start-Process
和
Start-Process "C:\Program Files\Oracle\VirtualBox\vboxmanage.exe" -ArgumentList "controlvm `"$vma`" savestate"
答案 1 :(得分:0)
我编写了带有vboxmanage完整路径的脚本,并使用powershell -f从命令行运行,并且不会发生错误。
所以我想这与ISE有关。
新代码:
$vmstate = (& "C:\Program Files\Oracle\VirtualBox\vboxmanage.exe" showvminfo $vma --machinereadable | % { if ($_ -like 'VMState="*"') { $_ } })
Write-Host $vma $vmstate
if ($vmstate -like '*run*')
{
# Power off VM before restoring snapshot
Write-Host "Wait while "$vma" is powered off (saving state)"
& "C:\Program Files\Oracle\VirtualBox\vboxmanage.exe" controlvm $vma savestate
}
else
{
# Start VM
Write-Host "Wait while "$vma" is started"
& "C:\Program Files\Oracle\VirtualBox\vboxmanage.exe" startvm $vma
}
在命令行上:
powershell -f "C:\Users\craig\My Documents\vbox.ps1"
不知道是否有人想分享为什么ISE会导致错误。