VBoxManage中的PowerShell错误unregistervm --delete

问题描述 投票:0回答:1

为什么try部分工作正常,但是catch部分给出了错误?奇怪的是,即使给出错误,它仍然会删除。有什么想法吗?

# Set VRAM size
try {
 Write-Host -nonewline "Setting VRAM size: $($vramsize) MB.. "
 C:\"Program Files"\Oracle\VirtualBox\VBoxManage modifyvm "$vmname" --vram $vramsize
 Write-Host -foregroundcolor green "OK."
}
catch {
 C:\"Program Files"\Oracle\VirtualBox\VBoxManage unregistervm --delete $vmname
 Write-Host -foregroundcolor red "!!! $_.Exception.Message"
 write-error "Fatal: Failed to set VRAM size."
 exit 1
}

这里是错误:

C:\Program Files\Oracle\VirtualBox\VBoxManage : 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
At C:\program files\kulo\files\temp\ubu.pxe.boot.ps1:380 char:2
+  C:\"Program Files"\Oracle\VirtualBox\VBoxManage unregistervm --delet ...
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (0%...10%...20%....0%...90%...100%:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
powershell virtualbox
1个回答
0
投票

正如您在错误输出中看到的那样,PowerShell尝试执行以下行的输出:

C:\"Program Files"\Oracle\VirtualBox\VBoxManage unregistervm --delete $vmname

这是0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%之类的文本,PowerShell无法执行。在您的try块中没有问题,因为在那里,VBoxManage不会生成任何输出。

无论如何,您的try和catch块将无法在这样的呼叫上运行。您需要PowerShell cmdlet引发可以捕获的异常。如果调用外部程序,则必须评估其退出代码。我根据您的示例建议以下解决方案:

Write-Host "Setting VRAM size: $vramsize MB... " -NoNewline
$process = Start-Process 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' -ArgumentList "modifyvm `"$vmname`" --vram $vramsize" -Wait -PassThru
if ($process.ExitCode -eq 0) {
    Write-Host "OK." -ForegroundColor Green 
} else {
    Write-Host "NOT OK." -ForegroundColor Red
    Start-Process 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' -ArgumentList "unregistervm --delete `"$vmname`""
    Write-Error "Fatal: Failed to set VRAM size."
    exit 1
}

我用$vramsize=128测试成功的情况,用$vramsize=512测试错误的情况。

© www.soinside.com 2019 - 2024. All rights reserved.