我有一个简单的批处理文件来部署 VM 镜像(.ova 文件),然后将其导入 VirtualBox 并启动它。
以下是脚本的最后几行:
call "%vboxmanage_exe%" import "%dest_path%\%latest_vm_filename%" --vsys 0 --vmname %vm_name%
IF %ERRORLEVEL% neq 0 (
ECHO VM import failed!
EXIT /b 1
)
call "%vboxmanage_exe%" startvm "%vm_name%" --type headless
IF %ERRORLEVEL% neq 0 (
ECHO VM start failed!
EXIT /b 1
)
启动命令实际上是这样的:
VBoxManage.exe startvm "D:\Vms\Latest.ova" --type headless
当已经存在一个具有我在命令中指定的名称的虚拟机时,就会出现错误,并且我的脚本会捕获该错误(echo 和 exit 都会执行)。
但是,如果导入成功并尝试启动它,但失败了,则不会捕获错误并继续...startvm 命令始终返回等于 0 的退出代码?
这是我尝试启动虚拟机时遇到的错误(引入是为了测试机制)。
VBoxManage.exe: error: Nonexistent host networking interface, name 'Broadcom NetXtreme 57xx Gigabit Controller' (VERR_INTERNAL_ERROR)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component Console, interface IConsole
我如何知道启动是否失败,并以适当的错误代码退出我的批处理文件。我想我可以检查虚拟机状态以查看它是否正在运行(尚未研究这种可能性),但我不想这样做并从 startvm 命令获取实际错误。
编辑:我发现唯一非常相似的是:batch: Exit code for "rd" is 0 on error as well
我尝试了建议的解决方案,但它对我不起作用。
最佳答案
鉴于额外信息,请尝试以下操作:
call "%vboxmanage_exe%" startvm "%vm_name%" --type headless 2>&1 |find "error:" >nul && exit /b 1
它假设您提供的错误消息位于控制台上而不是日志文件中,这需要不同的方法。
关于batch-file - 当出现错误时,VirtualBox startvm 命令始终返回退出代码 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22570661/