简短的教育故事

简短的教育故事

我想启动或恢复虚拟机,并且只要我可以控制鼠标就将其置于暂停模式(host+p)。

这样,我可以启动虚拟机并执行其他任务,但虚拟机不会耗尽系统资源,而且我可以通过取消暂停来随意使用虚拟机。就像使用 Firefox 一样,将其启动到内存中,这样当您需要时就可以使用。

我正在使用 Windows。

答案1

Oracle VirtualBox 可以完全通过命令行进行管理,因此可以编写一个脚本来执行此操作。

创建一个批处理文件,例如Start VM.cmd,将以下内容放入其中:

@echo off

cd /d "C:\Program Files\Oracle\VirtualBox"

start "" VirtualBox.exe --startvm "Virtual Machine 1"
set var=""
echo Waiting for the virtualbox to complete its startup routine.
:loop
for /f "delims=" %%A in ('vboxmanage list runningvms') do set "var=%%A"
set var2=%var:"=%
if "%var2%"=="Virtual Machine 1 {d325eda7-8abc-4083-9bc5-d41b3acf0ba5}" goto next
goto loop

:next

VBoxManage controlvm "Virtual Machine 1" pause

将第二行更改为您安装 VirtualBox 的路径。另外,将虚拟机的名称和 guid 更改为与您的脚本中各个位置的名称和 guid 相匹配。

您可以通过打开命令提示符并输入以下命令来执行此操作:

C:\Program Files\Oracle\VirtualBox\vboxmanage list vms

复制整行并将其粘贴到批处理文件中,然后从虚拟机名称中删除周围的引号(“)。

例如,"Virtual Machine 1" {d325eda7-8abc-4083-9bc5-d41b3acf0ba5}变成Virtual Machine 1 {d325eda7-8abc-4083-9bc5-d41b3acf0ba5}

简短的教育故事

我在这个脚本中做了一些事情,我将解释其中的缺陷以及我这样做的原因。

我使用 start 启动虚拟机,以确保脚本在 VM 启动时继续运行。如果我不这样做,脚本将等待 VM 终止后才能继续运行。

接下来,set var=""如果您通过双击资源管理器中的图标来启动脚本,那么从技术上讲这不是必需的,但如果您使用命令提示符并多次运行它,则它只会在第一次起作用。

接下来,我创建一个循环。在循环中,我查询哪些 VM 正在运行。如果我感兴趣的 VM 确实正在运行,我们将中断循环。现在,我必须在这里执行一个技巧才能使其工作。由于 vm 返回包含“,它会认为“在之前的 if 语句中,并导致脚本不起作用。为了解决这个问题,我从 %var% 中删除任何“并将其存储为 var2。这是必需的,因为如果没有 VM 正在运行,%var% 就不会更新。我会使用set var=%var:"=%它来工作一次,并在下一个循环中中断脚本,并以错误终止它。

最后,在虚拟机运行后,它会进行精确匹配并中断循环。然后,暂停命令将发送到虚拟机,它会尽快暂停虚拟机。这不是即时的,但延迟很小,并且鉴于 vboxmanage list running vms 返回它,系统知道它会接受该命令。

相关内容