用于浏览VirtualBox VM的Powershell脚本可以正常工作但每次都有错误

时间:2017-11-11 15:00:18

标签: powershell virtualbox powershell-v4.0

我编写了一个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计算出结果之前保存了状态!?!

有什么想法吗?

  • VBox v5.1.24
  • PowerShell v4.0
  • Windows 8.1

此致

克雷格

2 个答案:

答案 0 :(得分:1)

您的“问题”是,您在ISE中使用PowerShell。尝试直接使用PowerShell。区别?首先有两个奇怪的事情:

  1. 使用savestate的{​​{1}}参数时,成功的输出(vboxmanage)将被写入0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%(而不是stderr)更合适的imo)。
  2. 如果外部程序写入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会导致错误。