簡體   English   中英

如何通過命令行檢查VirtualBox VM是否未在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

邏輯是這樣的:

  1. 發送controlvm命令以執行目標VM的ACPI關閉。
  2. 使用FOR遍歷正在運行的VM列表,以查看目標VM是否仍在運行。
  3. 如果目標VM仍在運行,則不執行任何操作,然后返回:LOOP的開頭並重新檢查,直到結果更改為止。
  4. 如果在“正在運行的虛擬機”列表中不再看到目標虛擬機,則認為此構建步驟成功。

主要問題是:LOOP子句中的FOR語句。 在構建步驟的“啟動”部分中,我可以使用VboxManage list runningvms來確定是否列出了指定的VM,並以此方式對其進行處理,並表明可以成功啟動用於啟動指定VM的Jenkins構建。

但是,我注意到,一旦通過較早的controlvm命令將目標虛擬機從正在運行的虛擬機列表中刪除, FOR語句的整個DO部分就什么都不做。 它不會將VM_State=%%a設置為一個,也不會做我在FOR語句中拋出的其他任何事情。 這導致:LOOP無限循環,因為唯一的條件檢查器不會觸發。

問題:是否可以確定特定名稱的VM是否已關閉電源?

筆記:

  • Jenkins的VirtualBox插件與當前的VirtualBox版本(5.1.30)不兼容。
  • Jenkins版本是2.122。
  • 經過測試,以上代碼在目標計算機和我自己的計算機上作為獨立的.bat文件運行時的行為均相同。
  • 涉及的所有系統均在Windows 10 v1803上。

這在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM