Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Virtualbox Backup задание в планировщике (http://forum.oszone.net/showthread.php?t=323873)

zegordo 15-02-2017 17:13 2712011

Virtualbox Backup задание в планировщике
 
Понадобилось делать еженочный бэкап виртуальных жёстких дисков виртуалбокса с особенностями:

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ми, удалять самые старые по дате
архивация скопированных виртдисков(с удалением копии, с которой делался архив. Чтобы остались только архивы)
//конец скрипта


возможно имеет смысл выключить одну-сделать операции-включить и перейти на следующую виртуальную машину
но т.к. ночь, времени много, отключать все их разом или по-очереди разницы нет.
так же, клонировать диск нужно именно программой виртуалбокса, т.к. она создаёт для него уникальный номер в процессе клонирования, что позволит избежать возможные проблемы в будущем при восстановлении из бэкапа.
возможно, скрипт можно сделать значительно проще.

Iska 15-02-2017 17:46 2712018

Цитата:

Цитата zegordo
(или другим неведомым мне способом »

Указывая полный путь к ней.

alpap 15-02-2017 19:09 2712047

Цитата:

Цитата zegordo
создание папки с именем-датой по пути D:\vmbackup\ »

Код:

cd /d "D:\vmbackup"
if not exist "name_%date%" md "name_%date%"

Цитата:

Цитата zegordo
ожидание, пока не закончится операция »

спорный момент, даже ожидая что процесс закончил свою работу (пропал) не даст гарантии что это так, надо это все знать очень хорошо и понимать именно самому, достаточтно просто использовать: timeout /? или проверять по имени в tasklist /? или еще как
Цитата:

Цитата zegordo
проверка скриптом количества папок и, если больше 7ми, удалять самые старые по дате »

удалит все папки пропуская первые семь свежих (по дате создания)
Код:

for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc "papka"') do >nul 2>&1 rd /s /q "%%a"
Цитата:

Цитата zegordo
архивация ...»

такое уже количество информации по этой части чтобы писать такой пункт, ищите ..., шансов не найти нет.

zegordo 15-02-2017 19:36 2712052

Цитата:

Цитата alpap
такое уже количество информации по этой части чтобы писать такой пункт, ищите ..., шансов не найти нет. »

http://forum.oszone.net/thread-311492.html годится?
Цитата:

Цитата alpap
спорный момент, даже ожидая что процесс закончил свою работу (пропал) не даст гарантии что это так, надо это все знать очень хорошо и понимать именно самому, достаточтно просто использовать: timeout /? или проверять по имени в tasklist /? или еще как »

а есть возможность брать в цикле через Nые промежутки времени проверку на сообщение "100%" или "created" (которое на скрине есть) и если проверка успешна, приступать к следующему пункту
а если нет - идти дальше по скрипту, оформив это в логе

alpap 15-02-2017 19:48 2712055

Цитата:

Цитата zegordo
а есть возможность брать в цикле ...»

а так
Код:

for /f "delims=" %%a in ('"VBoxManage clonemedium "исходный_путь_виртдиска\диск1.vdi" "D:\vmbackup\папка_с_датой\диск1.vdi""') do echo "%%a">>"log.txt"
есть нужный (или вообще что-то) вывод в файл?

Пути живые поставьте для проверки.

Iska 15-02-2017 20:10 2712057

Цитата:

Цитата alpap
даже ожидая что процесс закончил свою работу (пропал) не даст гарантии что это так, »

VBoxManage.exe — CUI, по другому быть не может. Другое дело, что он может не сам обработку делать, а отдавать куда-то дальше.

Цитата:

Цитата zegordo
а есть возможность брать в цикле через Nые промежутки времени проверку на сообщение "100%" или "created" (которое на скрине есть) и если проверка успешна, приступать к следующему пункту »

zegordo, покажите, как именно выглядит «случай если слегка подвиснет», и что при этом происходит с последующими командами, если не использовать всякие ping/timeout.

zegordo 16-02-2017 14:32 2712255

Цитата:

Цитата Iska
и что при этом происходит с последующими командами, если не использовать всякие ping/timeout. »

отличный вопрос! затестировал
происходит просто пауза, пока не закончится операция с предыдущей, таким образом тайм ауты и пинги не нужны
более того, VBoxManage.exe сам может создавать папку если её нет, таким образом
cmdшная команда тоже тут не нужна.
Код:

cd /d "D:\vmbackup"
if not exist "name_%date%" md "name_%date%"

в итоге, скрипт на остановку-копию-запуск будет таким:
Код:

"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" controlvm "имя_виртуалки" savestate
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" clonemedium "путь_к_виртдиску\имя_виртдиска.vdi" "путь_к_копии_виртдиска\%date%\имя_виртдиска.vdi"
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" startvm "имя_виртуалки" --type headless
//повторить для других виртуальных машин
проверка скриптом количества папок в папке "D:\vmbackup" например, и, если больше 7ми, удалять самые старые по дате
запись всех итогов(достаточно просто копии всех надписей что в окне cmd прошло) в лог в этой же %date% папке в txt

выделил удаление папок, т.к. скрипт от товарища alpap
не сработал

он же, из этой же папки запущенный

так же, уважаемый товарищ alpap, это, я так понимаю, запись в лог?
Код:

for /f "delims=" %%a in ('"VBoxManage clonemedium "исходный_путь_виртдиска\диск1.vdi" "D:\vmbackup\папка_с_датой\диск1.vdi""') do echo "%%a">>"log.txt"

alpap 17-02-2017 01:39 2712410

Цитата:

Цитата zegordo
не сработал »

при ваших именах (на предоставленном выводе) код сохранить в кодировке 866
Код:

pushd "papka"
 for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc') do >nul 2>&1 rd /s /q "%%a"
popd

Цитата:

Цитата zegordo
это, я так понимаю, запись в лог? »

нет, это просто я так хотел проверить вывод VBoxManage - забудьте.

zegordo 17-02-2017 12:28 2712490

на данный момент выглядит так:

Код:

# сохранение состояния вирт машины и её выключение
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" controlvm "имя_вирт_машины" savestate

# клонирование диска с присваиванием ему нового uuid
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" clonemedium "C:\путь_к_исходному_вирт_диску\имя_вирт_диска.vdi" "C:\путь_к_папке_бэкапов\%date%\имя_вирт_диска2.vdi"

# запуск виртуалки в фоновом режиме
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" startvm "имя_вирт_машины" --type headless

#удаление нового жёсткого диска из менеджера виртуальных носителей (во избежание огромного количества неиспользуемых копий дисков и ошибок при удалении старых)
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" closemedium disk "C:\путь_к_папке_бэкапов\%date%\имя_вирт_диска2.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

сложный вопрос: реально ли результаты всех команд вывести в лог файл в папке с копией диска?
и есть ли возможность из планировщика запускать его в фоне? (чтобы окно cmd не открывылось)

alpap 17-02-2017 15:43 2712549

Цитата:

Цитата zegordo
результаты всех команд вывести в лог файл »

по простому покомандно и конечно повторять для каждой выводимой команды >>"log.txt" (пример):
Код:

for %%a in ("Эта строка будет записана в файл "log.txt"") do echo %%~a>"log.txt"
но удобнее все целиком и компактнее, но это уже не по простому (если сразу вначале поставить @echo off, запись будет без команд как указано в коде ниже с этим примером, но при включенном при проверке можно растеряться и так есть кое-какие нюансы):
Код:

@echo on
set "f=log.txt"
set "s1=Эта строка будет записана в файл "%f%" вместе с командой"
set "s2=Эта строка будет записана в файл "%f%" без команды"
set "s3=Эта строка не будет записана в файл "%f%" так как вывод занулен"
>"%f%" (
 for %%a in ("%s1%") do echo %%~a
 @echo.
 for %%a in ("%s2%") do @echo %%~a
 @echo.
 for %%a in ("%s3%") do @echo %%~a>nul& echo Занулена ^(пропущена^)
 @echo.
 @echo off
 for %%a in ("%s2%") do echo %%~a
)
pause

Цитата:

Цитата zegordo
из планировщика запускать его в фоне? (чтобы окно cmd не открывылось) »

этот код сохранить в файле "file.vbs"
Код:

WScript.CreateObject("WScript.Shell").Run """%comspec%"" /c """ & WScript.Arguments.Item(0) & """", 0, False
пример запуска: "file.vbs" "name.bat"
а в планировщике указать запуск файла "file.vbs" (путь к нему)
и добавить запуск с параметром и указать путь к "name.bat"

zegordo 17-02-2017 23:22 2712654

не совсем понял в этом коде,

Код:

@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
)


alpap 18-02-2017 01:12 2712669

zegordo,
ууу, как все запущено , у меня просто наводящий пример, не более:)

давайте сюда ваш полный рабочий код и напишите какую информацию из него надо получить в лог, но привязавшись к командам, в коде которые ее выдают
например, в строке: VBoxManage clonemedium...
неизвестно можно ли получить вывод в лог что-то кроме строки команды лишь
в подобной строке: ping -n 6 127.0.0.1
если не зануляя вывод можно получить, но нужен ли он, здесь важно прошел пинг или нет, зачем вам TTL=... или кол-во мс

я же не могу и думать за вас, вы сами должны определить что вы хотите анализировать как вы хотите это сделать (примерно) как хотите видеть.

для начала выложите полный рабочий код, я посмотрю и скажу что можно (желательно) вывести в лог и покажу как сделать.

zegordo 18-02-2017 13:26 2712754

на данный момент рабочий код (пути команд тестовые(но рабочие), потому и диск везде один)
Код:

# сохранение состояния вирт машины и её выключение
"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
сохранение состояния вирт машины с её выключением

клонирование диска

запуск вирт машины


команда удаления диска из вирт носителей ничего не пишет, но там это и не нужно.
собственно, всю информацию на скринах выше (включая % и сами команды) и нужно получить в логе, включая итог очистки папок(какие удалились).
команды ошибок операций vboxmanage.exe инициировать просто не получится, но выглядят они ровно таким же текстом, как на скринах выше.

alpap 18-02-2017 14:16 2712768

например:
Код:

@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


zegordo 18-02-2017 16:45 2712804

большое спасибо!
всё работает, заменить пути в переменные это интересный подход
чтобы писал в папку с датой лог, добавил создание папки из вашего поста ранее + добавил переменную клона диска, чтобы не было путаницы.
Код:

@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 окне

а сам лог содержит только текст
Код:

Clone medium created in format 'VDI'. UUID: f1b31377-47f0-40bb-b5f8-6145c11977e5
Waiting for VM "GLPI рабочая" to power on...
VM "GLPI рабочая" has been successfully started.

как добавить в него команды и имена удалённых папок?

alpap 18-02-2017 18:52 2712843

Код:

...
>"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

проверьте строку [@>nul "%VB%" controlvm "%d_GL%" savestate], не убьет ли случайно это не только вывод но и операцию

Вообще с учетом что вы заходите в папку код можно так переписать:
Код:

@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

но есть одно но, я его не знал. Удаление папок происходит в этой же папке, а вы создаете папку (опять же здесь) с именем "%date%", она естественно будет свежей и войдет в число (7) удаляемых, поэтому, наверное, есть смысл записать for /f "skip=8 ..., ну это на ваше усмотрение, а предупредить надо.

zegordo 18-02-2017 20:21 2712869

Цитата:

Цитата alpap
она естественно будет свежей и войдет в число (7) удаляемых »

не совсем понял, скрипт же оставляет 7 свежих по дате, удаляя все, кто старее, считая от 8 и старее включительно, разве нет?
Цитата:

Цитата alpap
проверьте строку [@>nul "%VB%" controlvm "%d_GL%" savestate], не убьет ли случайно это не только вывод но и операцию »

удивительно, ничего не изменилось
те же проценты в cmd окне и та же инфа в логе
Код:

Clone medium created in format 'VDI'. UUID: b24af47a-68af-4e18-9363-e64c32d622f4
Waiting for VM "GLPI рабочая" to power on...
VM "GLPI рабочая" has been successfully started.
“¤*«Ґ*л б ᮤҐа¦Ё¬л¬:
jhashah
shshhs
23424
shshsh
hsjsjsjj

вместо кракозябр - Удалены с содержимым быть должны, но этого нет и это странно - код в 866 oem-русская сохранён.

alpap 18-02-2017 22:37 2712914

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

код сохранить в 866 это понятно, но и файл-лог должен быть в 866 чтобы нормально его прочитать, у меня в AkelPadовском блокноте автоматом файлы создаются в 866, можете пересохранить или все затачивать изначально под 1251, но с кириллическими именами и путями намучаетесь

Цитата:

Цитата zegordo
не совсем понял, скрипт же оставляет 7 свежих по дате »

вы это писали когда в коде не было предусмотрено создание папки %date% (или мне так показалось), так она, эта папка, будет свежей и будет занимать одно место из 7ми, т.е. как-бы из-за нее вы оставляете теперь только 6 (с ней 7) папок, я и предположил добавить ей место и сделать конечным числов оставляемых папок - 8

а вообще (мне лично) стремно было бы держать папку с логом ((%date%), а могла бы быть и очень важная информация) в папке, в которой же происходит удаление папок или же держал просто файлом тоже с именем %date% или вообще не в этой папке.

Iska 18-02-2017 23:55 2712937

zegordo, alpap, статус:
Код:

0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
пишется утилитой не в стандартный поток вывода (1), а в стандартный поток ошибок (2). Если нужно и его перенаправить в лог, то:
Цитата:

Код:

>"%f_log%" 2>&1 (
    "%VB%" controlvm "%d_GL%" savestate
    …
)



alpap 19-02-2017 02:25 2712955

Iska,
спасибо, до меня уже позже дошло, опередили.
пока это исключено вообще из логгирования, посмотрим на ответ ТС

zegordo 19-02-2017 19:39 2713136

Цитата:

Цитата alpap
а вообще (мне лично) стремно было бы держать папку с логом ((%date%), а могла бы быть и очень важная информация) »

возможно этот пункт мне стоит в будущем доработать, а именно если в логе ошибка - то лог или сохранять или оповещать. на данный момент сойдёт и так(в целях тестирования).
так же, возможно в будущем будет другой скрипт, который будет проверять логи на ошибки - удалять папки без ошибок, а по ошибкам оповещать, тут вариантов несколько есть и это надо будет хорошо продумать, но это уже второй вопрос.

что касается скрипта, через 2>&1 действительно работает!
вот что пишется в лог файле:
Код:

сохранение состояния и выключение вирт. машины
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
клонирование виртуального диска
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'VDI'. UUID: bc88a95e-94d4-4449-a0ae-86a5ab68ba07
запуск вирт. машины
Waiting for VM "GLPI Ёрсюўр*" to power on...
VM "GLPI Ёрсюўр*" has been successfully started.
следующие папки удалены с содержимым:
hahah
aijaf
agaig
agag
jsjooss

с кодировкой беда, т.к. файл выше - 866
а ниже, если в 1251
Код:

б®еа**Ґ*ЁҐ б®бв®п*Ёп Ё ўлЄ«озҐ*ЁҐ ўЁав. ¬*иЁ*л
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Є«®*Ёа®ў**ЁҐ ўЁавг*«м*®Ј® ¤ЁбЄ*
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'VDI'. UUID: 19aee34a-1ecc-44fa-b3d6-1b9d87da9e4a
§*ЇгбЄ ўЁав. ¬*иЁ*л
Waiting for VM "GLPI рабочая" to power on...
VM "GLPI рабочая" has been successfully started.
б«Ґ¤гойЁҐ Ї*ЇЄЁ г¤*«Ґ*л б ᮤҐа¦Ё¬л¬:

т.е. названия, что создаёт утилита, видны только в 1251. решением этого вижу называть виртуалки только английскими буквами

ну и рабочий код:
Код:

@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%" 2>&1(
@echo сохранение состояния и выключение вирт. машины
"%VB%" controlvm "%d_GL%" savestate
@echo клонирование виртуального диска
 "%VB%" clonemedium "C:\Users\admin\Documents\Virtualbox VMs\%d_GL%\%f_GL1%" "%date%\%f_GL2%"
@echo запуск вирт. машины
 "%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"
)

который можно проапгрейдить под любое число виртуалок

всем спасибо, вопрос считаю решённым
возможно, кому-то из гугла это решение поможет, т.к. я в чистом поиске такого решения не нашёл, почему и обратился сюда.

zegordo 16-03-2017 15:16 2720004

alpap, скажите пожалуйста, как после кода
Код:

@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%" 2>&1(
@echo сохранение состояния и выключение вирт. машины
"%VB%" controlvm "%d_GL%" savestate
@echo клонирование виртуального диска
 "%VB%" clonemedium "C:\Users\admin\Documents\Virtualbox VMs\%d_GL%\%f_GL1%" "%date%\%f_GL2%"
@echo запуск вирт. машины
 "%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"
)

после строчки
Код:

for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc') do @echo %%a& rd /s /q "%%a"
можно добавить такое же удаление с выводом в лог удалённых:
1. файлов в любых путях
2. папок в любых путях

alpap 16-03-2017 17:56 2720054

Цитата:

Цитата zegordo
в любых путях »

к такому вопросу надо подходить очень щепетильно и в идеале все-таки лучше удалять целенаправленно (по возможности)

а логгирование ..., просто оберните нужный код с предусмотренным выводом чего нужно в лог и все

папки
Код:

@echo off
::cd /d "papka"
>"%~dp0log_del.txt" (
 @echo следующие папки удалены с содержимым:
 for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc') do @echo %%a& rd /s /q "%%a"
)
pause

файлы
Код:

@echo off
::pushd "papka"
>"log_del.txt" (
 @echo следующие файлы удалены с содержимым:
 for /f "skip=7 delims=" %%a in ('dir /a-d/b/o-d/tc') do @echo %%a& del /q "%%a"
)
::popd
pause

ну и дату, наверное имеет смысл поставить в лог
@echo [%date%_%time%] следующие папки удалены с содержимым:


Время: 23:25.

Время: 23:25.
© OSzone.net 2001-