如果VirtualBox虚拟机未在Windows上运行,如何通过命令行进行检查

时间:2018-06-04 09:32:05

标签: windows jenkins virtualbox

我正在开发Jenkins项目,使用用户提供的参数远程启动和关闭特定的VM。

我已经设法找到一种方法来确定指定的VM已启动并正在运行并准备好进一步说明,但我还没有找到一种方法来确定指定的VM已关闭电源。

构建步骤中使用的当前代码是:

@ECHO OFF
SETLOCAL EnableDelayedExpansion

ECHO Shutting down VM %VM% on Host %computername%...
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" controlvm %VM% acpipowerbutton
ECHO %ERRORLEVEL%
IF ERRORLEVEL 1 EXIT /B 1

:LOOP
WAITFOR /T 10 VMtoShutDown 2>NUL
FOR /f %%a IN ('VBoxManage list runningvms ^| FINDSTR %VM%') DO SET VM_State=%%a
IF [!VM_State!] EQU [] (
ECHO %VM% is not running.
EXIT /b 0
)
GOTO LOOP

逻辑是:

  1. 发送controlvm命令以执行目标VM的ACPI关闭。
  2. 使用FOR遍历正在运行的VM列表,以查看目标VM是否仍在运行。
  3. 如果目标VM仍在运行,请不要执行任何操作,然后返回到开头:LOOP并重新检查,直到结果发生更改。
  4. 如果在运行虚拟机列表中不再显示目标虚拟机,请考虑此构建步骤是否成功。
  5. 主要问题是FOR子句中的:LOOP语句。在构建步骤的Startup部分中,我可以使用VboxManage list runningvms来确定是否列出了指定的VM,并因此处理它并指示Jenkins构建以启动指定的VM成功。

    但是,我注意到,一旦目标VM通过早期controlvm命令从正在运行的VM列表中删除,DO语句的整个FOR部分就不会什么都不做它没有为{1}设置VM_State=%%a,并且它没有做我在FOR语句中抛出的任何其他内容。这导致:LOOP无限循环,因为唯一的条件检查器不会触发。

    问题:有没有办法确定特定名称的VM是否已关机?

    注意:

    • Jenkins的VirtualBox插件与当前的VirtualBox版本(5.1.30)不兼容。
    • Jenkins版本是2.122。
    • 上面的代码在目标计算机和我自己的计算机上作为独立的.bat文件运行时的行为相同。
    • 所有涉及的系统都在Windows 10 v1803上。

1 个答案:

答案 0 :(得分:0)

这在Windows 10上对我有效,希望对您有所帮助!

@ECHO OFF
SETLOCAL EnableDelayedExpansion

ECHO Shutting down VM %VM% on Host %computername%...
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" controlvm %VM% acpipowerbutton
ECHO VirtualBox command return code: %ERRORLEVEL%
IF ERRORLEVEL 1 EXIT /B 1

:LOOP
REM Sleep for 1 second by using a ping hack :)
ping -n 2 127.0.0.1 > nul
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" showvminfo %VM% | findstr /c:"powered off" >NUL
IF %ERRORLEVEL% EQU 0 GOTO END
echo VM %VM% not powered off yet...
GOTO LOOP

:END
echo VM %VM% powered off.