|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Virtualbox Backup задание в планировщике |
|
CMD/BAT - [решено] Virtualbox Backup задание в планировщике
|
Пользователь Сообщения: 77 |
Понадобилось делать еженочный бэкап виртуальных жёстких дисков виртуалбокса с особенностями:
0. скрипт должен останавливать виртуальные машину 1. скрипт будет создавать папку по указанному пути с сегодняшней датой, формата "дд_мм_гггг" 2. в эту папку он будет копировать диски виртуальных машин и сжимать их 7z 3. после окончания копирования запускать виртуальную машину 4. проверить количество папок, если их больше 7 - удалять самы 4. писать txt лог в этой же папке всего что он сделал или не сделал. У виртуалбокса есть утилита в папке с установленной программой, vboxmanage.exe Если cmd через команду "cd"(или другим неведомым мне способом) установить путь, где лежит она, ей можно пользоваться используя её аргументы. Я вижу скрипт, который нужно запихнуть в планировщик заданий windows следующим: (жирные слова - то что сделать не удалось) Скрытый текст
//начало скрипта cd "C:\Program Files\Oracle VirtualBox" //переходит в каталог с утилитой виртуалбокса vboxmanage controlvm "виртуалка1" savestate> //эта команда сохраняет текущее состояние и выключает виртуалку. Используется именно этот вариант, т.к. не всегда перезагрузка желательна. выглядит так, проценты идут в процессе сохранения:
![]() ping -n 6 127.0.0.1 >nul //на случай если слегка подвиснет при сохранении состояния. возможно есть команда ожидания конца операции, но т.к. это vboxmanage, bat это отследить вряд ли сможет. vboxmanage controlvm "виртуалка2" savestate> ping -n 6 127.0.0.1 >nul vboxmanage controlvm "виртуалка3" savestate> ping -n 6 127.0.0.1 >nul создание папки с именем-датой по пути D:\vmbackup\ VBoxManage clonemedium "исходный_путь_виртдиска\диск1.vdi" "D:\vmbackup\папка_с_датой\диск1.vdi" ожидание, пока не закончится операция. операция выглядит так, проценты идут в процессе клонирования
![]() аналогично для других виртдисков(важно отметить, их количество может меняться) vboxmanage startvm "виртуалка1" --type headless //запускает виртуалку в фоновом режиме выглядит так, ждёт пока запустится и выдаёт сообщение successfully started:
![]() ping -n 6 127.0.0.1 >nul аналогично для других виртуалок проверка скриптом количества папок и, если больше 7ми, удалять самые старые по дате архивация скопированных виртдисков(с удалением копии, с которой делался архив. Чтобы остались только архивы) //конец скрипта возможно имеет смысл выключить одну-сделать операции-включить и перейти на следующую виртуальную машину но т.к. ночь, времени много, отключать все их разом или по-очереди разницы нет. так же, клонировать диск нужно именно программой виртуалбокса, т.к. она создаёт для него уникальный номер в процессе клонирования, что позволит избежать возможные проблемы в будущем при восстановлении из бэкапа. возможно, скрипт можно сделать значительно проще. |
|
Отправлено: 17:13, 15-02-2017 |
Пользователь Сообщения: 77
|
Профиль | Отправить PM | Цитировать не совсем понял в этом коде,
@echo on cd /d "C:\vmbackup" if not exist "%date%" md "%date%" set "f=C:\vmbackup\%date%\log.txt" set "s1=а куда, собственно, вписывать команду? Особенно, если в ней кавычки уже есть, например [C:\Program Files\Oracle VirtualBox\vboxmanage.exe" controlvm "имя виртуалки" savestate]" >"%f%" ( for %%a in ("%s1%") do echo %%~a @echo. @echo off ) |
Отправлено: 23:22, 17-02-2017 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать zegordo,
ууу, как все запущено , у меня просто наводящий пример, не более ![]() давайте сюда ваш полный рабочий код и напишите какую информацию из него надо получить в лог, но привязавшись к командам, в коде которые ее выдают например, в строке: VBoxManage clonemedium... неизвестно можно ли получить вывод в лог что-то кроме строки команды лишь в подобной строке: ping -n 6 127.0.0.1 если не зануляя вывод можно получить, но нужен ли он, здесь важно прошел пинг или нет, зачем вам TTL=... или кол-во мс я же не могу и думать за вас, вы сами должны определить что вы хотите анализировать как вы хотите это сделать (примерно) как хотите видеть. для начала выложите полный рабочий код, я посмотрю и скажу что можно (желательно) вывести в лог и покажу как сделать. |
Отправлено: 01:12, 18-02-2017 | #12 |
Пользователь Сообщения: 77
|
Профиль | Отправить PM | Цитировать на данный момент рабочий код (пути команд тестовые(но рабочие), потому и диск везде один)
# сохранение состояния вирт машины и её выключение "C:\Program Files\Oracle VirtualBox\vboxmanage.exe" controlvm "GLPI рабочая" savestate # клонирование диска с присваиванием ему нового uuid "C:\Program Files\Oracle VirtualBox\vboxmanage.exe" clonemedium "C:\Users\admin\Documents\Virtualbox VMs\GLPI рабочая\GLPI рабочая-disk1.vdi" "C:\vmbackup\%date%\GLPI рабочая-disk2.vdi" # запуск виртуалки в фоновом режиме "C:\Program Files\Oracle VirtualBox\vboxmanage.exe" startvm "GLPI рабочая" --type headless #удаление нового жёсткого диска из менеджера виртуальных носителей (virtual media manager) "C:\Program Files\Oracle VirtualBox\vboxmanage.exe" closemedium disk "C:\vmbackup\%date%\GLPI рабочая-disk2.vdi" # очистка всех папок, кроме 7 последних по дате pushd "C:\vmbackup\" for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc') do >nul 2>&1 rd /s /q "%%a" popd сохранение состояния вирт машины с её выключением
![]() клонирование диска
![]() запуск вирт машины
![]() команда удаления диска из вирт носителей ничего не пишет, но там это и не нужно. собственно, всю информацию на скринах выше (включая % и сами команды) и нужно получить в логе, включая итог очистки папок(какие удалились). команды ошибок операций vboxmanage.exe инициировать просто не получится, но выглядят они ровно таким же текстом, как на скринах выше. |
Отправлено: 13:26, 18-02-2017 | #13 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать например:
@echo off set "VB=C:\Program Files\Oracle VirtualBox\vboxmanage.exe" set "f_GL=GLPI рабочая-disk2.vdi" set "d_GL=GLPI рабочая" set "d_del=C:\vmbackup" set "f_log=log.txt" >"%f_log%" ( "%VB%" controlvm "%d_GL%" savestate "%VB%" clonemedium "C:\Users\admin\Documents\Virtualbox VMs\%d_GL%\%f_GL%" "C:\vmbackup\%date%\%f_GL%" "%VB%" startvm "%d_GL%" --type headless "%VB%" closemedium disk "C:\vmbackup\%date%\%f_GL%" for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc "%d_del%"') do @rd /s /q "%d_del%\%%a" ) pause |
Отправлено: 14:16, 18-02-2017 | #14 |
Пользователь Сообщения: 77
|
Профиль | Отправить PM | Цитировать большое спасибо!
всё работает, заменить пути в переменные это интересный подход чтобы писал в папку с датой лог, добавил создание папки из вашего поста ранее + добавил переменную клона диска, чтобы не было путаницы. @echo off cd /d "C:\vmbackup" if not exist "%date%" md "%date%" set "VB=C:\Program Files\Oracle VirtualBox\vboxmanage.exe" set "f_GL1=GLPI рабочая-disk1.vdi" set "f_GL2=GLPI рабочая-disk2.vdi" set "d_GL=GLPI рабочая" set "d_del=C:\vmbackup" set "f_log=C:\vmbackup\%date%\log.txt" >"%f_log%" ( "%VB%" controlvm "%d_GL%" savestate "%VB%" clonemedium "C:\Users\admin\Documents\Virtualbox VMs\%d_GL%\%f_GL1%" "C:\vmbackup\%date%\%f_GL2%" "%VB%" startvm "%d_GL%" --type headless "%VB%" closemedium disk "C:\vmbackup\%date%\%f_GL2%" for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc "%d_del%"') do @rd /s /q "%d_del%\%%a" ) pause проценты остаются в cmd окне
![]() а сам лог содержит только текст как добавить в него команды и имена удалённых папок? |
Отправлено: 16:45, 18-02-2017 | #15 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать ... >"log.txt" ( @>nul "%VB%" controlvm "%d_GL%" savestate ... @echo Удалены с содержимым: for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc "%d_del%"') do @echo %d_del%\%%a& rd /s /q "%d_del%\%%a" ) pause Вообще с учетом что вы заходите в папку код можно так переписать: @echo off cd /d "C:\vmbackup" if not exist "%date%" md "%date%" set "VB=C:\Program Files\Oracle VirtualBox\vboxmanage.exe" set "f_GL1=GLPI рабочая-disk1.vdi" set "f_GL2=GLPI рабочая-disk2.vdi" set "d_GL=GLPI рабочая" set "f_log=%date%\log.txt" >"%f_log%" ( @>nul "%VB%" controlvm "%d_GL%" savestate "%VB%" clonemedium "C:\Users\admin\Documents\Virtualbox VMs\%d_GL%\%f_GL1%" "%date%\%f_GL2%" "%VB%" startvm "%d_GL%" --type headless "%VB%" closemedium disk "%date%\%f_GL2%" @echo Удалены с содержимым: for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc') do @echo %%a& rd /s /q "%%a" ) pause |
Отправлено: 18:52, 18-02-2017 | #16 |
Пользователь Сообщения: 77
|
Профиль | Отправить PM | Цитировать Цитата alpap:
Цитата alpap:
те же проценты в cmd окне и та же инфа в логе вместо кракозябр - Удалены с содержимым быть должны, но этого нет и это странно - код в 866 oem-русская сохранён. |
||
Отправлено: 20:21, 18-02-2017 | #17 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать zegordo,
ладно сделаем в лоб @echo off cd /d "C:\vmbackup" if not exist "%date%" md "%date%" set "VB=C:\Program Files\Oracle VirtualBox\vboxmanage.exe" set "f_GL1=GLPI рабочая-disk1.vdi" set "f_GL2=GLPI рабочая-disk2.vdi" set "d_GL=GLPI рабочая" set "f_log=%date%\log.txt" "%VB%" controlvm "%d_GL%" savestate "%VB%" clonemedium "C:\Users\admin\Documents\Virtualbox VMs\%d_GL%\%f_GL1%" "%date%\%f_GL2%" "%VB%" startvm "%d_GL%" --type headless>>"%f_log%" "%VB%" closemedium disk "%date%\%f_GL2%">>"%f_log%" echo Удалены с содержимым:>>"%f_log%" for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc') do echo %%~fa>>"%f_log%"& rd /s /q "%%a" pause Цитата zegordo:
а вообще (мне лично) стремно было бы держать папку с логом ((%date%), а могла бы быть и очень важная информация) в папке, в которой же происходит удаление папок или же держал просто файлом тоже с именем %date% или вообще не в этой папке. |
|
Отправлено: 22:37, 18-02-2017 | #18 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
Отправлено: 23:55, 18-02-2017 | #19 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать Iska,
спасибо, до меня уже позже дошло, опередили. пока это исключено вообще из логгирования, посмотрим на ответ ТС |
Отправлено: 02:25, 19-02-2017 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Службы - [решено] Не запускается задание в планировщике задач при событии простой | Ferum01 | Microsoft Windows 7 | 1 | 15-04-2015 13:03 | |
Службы - [решено] Как создать задание в планировщике с помощью батника | Megatron13 | Microsoft Windows 7 | 17 | 15-02-2012 22:14 | |
CMD/BAT - создать задание в планировщике ХР по запуску батника | sov44 | Скриптовые языки администрирования Windows | 24 | 16-12-2011 09:05 | |
Не могу создать задание в планировщике задач | vlad_ok_777 | Microsoft Windows NT/2000/2003 | 0 | 18-05-2010 14:08 | |
Как программно добавить задание в планировщике задач | RVGroup | Программирование и базы данных | 5 | 24-10-2004 18:04 |
|