![](/img/trans.png)
[英]How to check if string is available on https page via command line on windows?
[英]How to check via command line if a VirtualBox VM is not running on Windows
我正在一个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
逻辑是这样的:
controlvm
命令以执行目标VM的ACPI关闭。 FOR
遍历正在运行的VM列表,以查看目标VM是否仍在运行。 主要问题是:LOOP
子句中的FOR
语句。 在构建步骤的“启动”部分中,我可以使用VboxManage list runningvms
来确定是否列出了指定的VM,并以此方式对其进行处理,并表明可以成功启动用于启动指定VM的Jenkins构建。
但是,我注意到,一旦通过较早的controlvm
命令将目标虚拟机从正在运行的虚拟机列表中删除, FOR
语句的整个DO
部分就什么都不做。 它不会将VM_State=%%a
设置为一个,也不会做我在FOR
语句中抛出的其他任何事情。 这导致:LOOP
无限循环,因为唯一的条件检查器不会触发。
问题:是否可以确定特定名称的VM是否已关闭电源?
笔记:
这在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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.