С 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
Измените 2-ую строку на путь, по которому установлен VirtualBox. Кроме того, измените имя и 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 для запуска виртуальной машины, чтобы убедиться, что скрипт продолжает работать, пока виртуальная машина запущена. Если я этого не сделаю, сценарий будет ожидать завершения работы виртуальной машины, прежде чем продолжить.
Далее я set var=""
Это технически необязательно, если вы запускаете сценарий двойным щелчком по значку из проводника, но если вы используете командную строку и запускаете ее несколько раз, она будет работать только в первый раз.
Далее я создаю цикл. В цикле я запрашиваю, какие виртуальные машины работают. Если виртуальная машина, которая мне интересна, действительно работает, мы прерываем цикл. Теперь я должен был выполнить трюк здесь, чтобы сделать эту работу. Поскольку возврат vm содержит "он бы подумал", был ранее в операторе if и заставляет скрипт не работать. Чтобы противодействовать этому, я удаляю любое из% var% и сохраняю как var2. Это необходимо, поскольку если виртуальная машина не запущена,% var% не обновляется. Если бы я использовал set var=%var:"=%
это сработало бы один раз, а в следующем цикле разрывает скрипт, завершая его с ошибкой.
Наконец, после запуска виртуальной машины она выполняет точное совпадение и прерывает цикл. Затем команда паузы отправляется на виртуальную машину, и она приостанавливает работу виртуальной машины как можно скорее. Это не мгновенно, но задержка минимальна, и, учитывая, что список vboxmanage, запускающий vms, возвращает его, система знает, что примет команду.