BAT скрипт для резервного копирования папки
Набросал ещё один маленький BAT скрипт для резервного копирование папки. Внесите свои данные и через scheduler настройте расписание резервного копирования.
Ссылки
Функции
- С помощью xcopy делает резервные копии папки.
- Каждый бэкап сохраняется в отдельную подпапку вида DD.MM.YYYY_hhmmmss.
- С помощью 7-Zip архивирует резервные копии.
- Удаляет старые резервные копии.
- DirName — название папки
- SourceDir — что бэкапим
- BackupDir — куда бэкапим
- NumFolders — сколько подпапок с бэкапами хранить
- a7z — путь к 7z.exe
Пример настройки расписания
В Task Scheduler настраиваем новое задание.
Выбираем пользователя, от имени которого будет выполняться резервное копирование. После сохранения задания нас спросят пароль от него. Ставим галку Run whether user is logged or not — запускать даже если юзер не залогинен.
В триггерах настраиваем расписание. У меня резервное копирование происходит раз в сутки.
Указываем ссылку на наш BAT файл.
Проверяем настройки. OK.
Теперь папка будет резервироваться раз в день. С настройкой NumFolders=10 в BAT файле мы будем хранить данные за последние 10 дней.
Если хотите хранить ежедневные и ежемесячные резервные копии — сделайте два BAT файла и два расписания резервного копирования в разные папки.
BAT скрипт для резервного копирования папки
Набросал ещё один маленький BAT скрипт для резервного копирование папки. Внесите свои данные и через scheduler настройте расписание резервного копирования.
Ссылки
Функции
- С помощью xcopy делает резервные копии папки.
- Каждый бэкап сохраняется в отдельную подпапку вида DD.MM.YYYY_hhmmmss.
- С помощью 7-Zip архивирует резервные копии.
- Удаляет старые резервные копии.
@echo off
SetLocal EnableDelayedExpansion
set DirName=my_folder
set SourceDir=C:\%DirName%
set BackupDir=B:\%DirName%\daily\
set NumFolders=10
0,2%
set h=%h: =0%
set FullBackupDir=%BackupDir%%date%_%h%%time:
xcopy %SourceDir% %FullBackupDir%%DirName%\ /E /F /H /R /K /Y /D 2>nul >nul
«%a7z%» a -tzip -bb0 -bd -sdel «%FullBackupDir%%DirName%.zip» «%FullBackupDir%» 2>nul >nul
for /f «tokens=* delims=» %%D in (‘dir %BackupDir% /ad /b /o-d’) do (
if not %%D==»» (
if not !NumFolders!==0 (
set /a NumFolders-=1
) else (
rd /s /q %BackupDir%%%D 2>nul >nul
)
)
)
- DirName — название папки
- SourceDir — что бэкапим
- BackupDir — куда бэкапим
- NumFolders — сколько подпапок с бэкапами хранить
- a7z — путь к 7z.exe
Пример настройки расписания
В Task Scheduler настраиваем новое задание.
Выбираем пользователя, от имени которого будет выполняться резервное копирование. После сохранения задания нас спросят пароль от него. Ставим галку Run whether user is logged or not — запускать даже если юзер не залогинен.
В триггерах настраиваем расписание. У меня резервное копирование происходит раз в сутки.
Указываем ссылку на наш BAT файл.
Проверяем настройки. OK.
Теперь папка будет резервироваться раз в день. С настройкой NumFolders=10 в BAT файле мы будем хранить данные за последние 10 дней.
Если хотите хранить ежедневные и ежемесячные резервные копии — сделайте два BAT файла и два расписания резервного копирования в разные папки.
Если вам понравилась статья, то ставьте 👍🏻 каналу.
Пишите комментарии, задавайте вопросы, подписывайтесь.
Простая автоматизация резервного копирования под Windows
Вопрос резервного копирования волнует каждого специалиста, ответственного за сохранность вверенных ему бесценных служебных документов/баз данных/иных файлов. Для того, чтобы чувствовать себя более уверенно перед лицом различных вероятных форс-мажоров, необходимо периодически выполнять резервное копирование критически важных данных. Не менее актуальна проблема сохранения нажитого непосильным трудом и для домашних пользователей.
Вашему вниманию предлагается простой, но эффективный скриптик, помогающий решать данную проблему.
Имеем исходные условия:
Операционная система: MS Windows XP, 2003 и т.п.;
Объекты резервирования: Папки и файлы, находящиеся на локальных и сетевых дисках в объеме
200 ГБ;
Бюджет: 0 руб.;
Количество специально-обученных сотрудников для настройки процесса: 1 чел.
Количество специально-обученных сотрудников для обслуживания процесса: 0 чел.
Задача: ежедневное полное резервное копирование данных, хранение заданного количества созданных бэкапов без участия оператора.
На просторах Сети можно найти довольно большое количество различных программ решающих подобную задачу. Согласно задачи и поставленных условий были найдены, установлены и протестированы в условиях приближенных к боевым следующие программы: Cobian Backup (9, 10), Toucan, Areca, FBackup, Backup2Net и программа резервного копирования Samsung Auto Backup (идет в комплекте с одноименным съемным диском).
Тестирование данных программ на рабочих объемах данных показало их устойчивую неспособность справиться с простой задачей автоматического создания ежедневных бэкапов данных требуемого объема. Проблемы возникали как на этапе подготовки к выполнению резервирования, так и собственно в прогрессе оного.
Дольше всех (около недели) продержался Cobian Backup 10, после чего пошел в отказную и упорно начал делать бэкапы только около 600 МБ данных и сваливаясь с кучей ошибок в логах. Манипуляции с настройками теневого копирования и архивирования ни к чему, к сожалению не привели, а так в целом программа оставила довольно приятное впечатление, так что к применению рекомендуется (при условии стабильной работы в Ваших конкретных условиях).
Особая надежда была на Toucan, так как программа относится к СПО. Но увы, надежды не оправдались. По ходу выполнения задания на разных этапах программа вываливалась с классической ошибкой о недопустимой операции и необходимости ее (программы) закрытия.
Остальные участники отбора так же не устроили меня по различным причинам. Подробнее раскрывать процесс тестирования указанных программ не вижу особого смысла, т.к. к цели написания данной статьи, это напрямую не относится.
Таким образом, простая идея с поиском свободного решения поставленной задачи оказалась с треском провалена. Так как бродить далее по просторам Сети на предмет бесплатных для коммерческого применения программ резервного копирования уже не было ни сил, ни желания, ни надежды, а бэкапы делать крайне необходимо, то возникло естественное решение/желание соорудить что-то собственное. Результатом раздумий в течении довольно непродолжительного времени стало предлагаемое ниже решение простой автоматизации резервирования данных посредством обыкновенного bat-скрипта и стандартного планировщика. Скрипт работает, что называется, «из коробки», и не требует дополнительного тестирования и отладки, требуется только предоставить ему входные данные и заранее создать участвующие в процессе каталоги (проверок на этот предмет из соображений простоты нет).
Предвидя недовольство многих по поводу выкладывания готовых к употреблению решений, хочу сказать, что не у многих наших сограждан есть желание/время/возможность/талант/вписать нужное, для того чтобы разбираться с синтаксисом стандартной командной строки Windows. Также посмею указать на вероятность отличную от нуля, что хотя бы несколько юных и зеленых администраторов обратят свой взор на несомненную бесполезность изучения данной области.
И так, приступим. Сначала приведу полный текст скрипта без комментариев. Полный разбор с комментариями см. ниже.
@Echo Off
echo %date% %time% ***Start***
SetLocal EnableDelayedExpansion
Set $SRC=list_add.txt
Set $EXC=list_excl.txt
Set $DST=D:\backups
Set $PSW=password
Set $COMPR=1
Set $COPIES=7
C:\»Program Files»\7-Zip\7z.exe a -t7z -mhe=on «%$DST%\files%DATE:
6,2%.7z» @%$SRC% -scsWIN -p%$PSW% -mx=%$COMPR% -ssw -xr@%$EXC% >> log_7z.log
For /F «Delims=» %%i In (‘DIR /B/O:-N %$DST%\files. -??-??_??-??-. 7z’) Do (
Set /A $COPIES-=1
If !$COPIES! LSS 0 DEL «%$DST%\%%i»
)
echo %date% %time% ***End***
Результатом ежедневной работы скрипта будет набор бэкапов нужных Вам данных, имеющий приблизительно такой вид:
dir d:\backups\
files2010-07-12_22-00-00.7z
files2010-07-13_22-00-00.7z
files2010-07-14_22-00-00.7z
files2010-07-15_22-00-00.7z
files2010-07-16_22-00-00.7z
Обещанный разбор с комментариями.
@Echo Off :: Отключение вывода текста скрипта
echo %date% %time% ***Start*** ::Вывод даты и времени старта скрипта
SetLocal EnableDelayedExpansion :: Команда изменяет работу с переменными в цикле.
В обычном случае, чтобы определить значение переменной окружения, надо воспользоваться конструкцией %переменная%. Однако, если значение переменной меняется внутри цикла и читается там же, то для корректной работы бат-файла, следует использовать команду SetLocal EnableDelayedExpansion и вместо символа «%», использовать символ «!». Иначе, значение переменной в цикле будет всегда одним и тем же — таким, каким было до входа в цикл.
Далее для успешной работы предлагаемого скрипта необходимо задать следущие входные параметры (переменные):
$SRC=list_add.txt ::файл-список архивируемых данных
$EXC=list_excl.txt ::файл-список исключаемых файлов
$DST=D:\backups ::место хранения резервных копий
$PSW=password ::секретный пароль шифрования архива
$COMPR=1 ::степень сжатия данных архиватором 7zip (1=самое быстрое архивирование, 5=нормальное сжатие, 9=ультра-сжатие, 0=архивация без сжатия)
$COPIES=7 ::количество хранимых резервных копий
Следующая строка запускает архивацию посредством 7-Zip файлов и папок перечисленных в файле list_add.txt, кроме файлов, указанных в файле исключений list_excl.txt
C:\»Program Files»\7-Zip\7z.exe a -t7z -mhe=on «%$DST%\files%DATE:
6,2%.7z» @%$SRC% -scsWIN -p%$PSW% -mx=%$COMPR% -ssw -xr@%$EXC% >> log_7z.log
Разберем эту строку подробнее:
C:\«Program Files»\7-Zip\7z.exe :: Указывает место расположения исполняемого файла архиватора 7-Zip (точнее его консольной версии);
a :: это команда добавления файлов/папок в архив;
-t7z :: ключ задает тип создаваемого архива = 7z;
-mhe=on :: включает шифрование паролем заголовка архива и имен файлов/папок в архиве;
6,2%.7z
Команда динамически формируем полный путь и имя файла архива вида «D:\backups\files2010-07-12_22-00-00.7z», где в имени присутствуют дата и время архивации;
@%$SRC% :: задает имя файла-списка архивируемых данных, вместо %$SRC% скрипт подставляет имя файла;
-scsWIN :: задает кодировку win для файла-списка;
-p%$PSW% :: ключ задает пароль для шифрования архива, вместо %$PSW% скрипт подставляет текстовую строку пароля;
-mx=%$COMPR% :: ключ задает степень сжатия архивируемых данных;
-ssw :: ключ разрешает архивацию файлов открытых приложениями на запись;
-xr@%$EXC% :: задает имя файла-списка данных, исключаемых из процесса архивации, r = означает, что надо исключать и подпапки, вместо %$EXC% скрипт подставляет имя файла;
>> log_7z.log :: символы >> обозначают перенаправление сообщений выводимых всей строкой с экрана (стандартного потока) в файл log_7z.log, это удобно для последущего анализа работы скрипта;
Эта часть скрипта отвечает за автоматическое удаление уже ненужных архивов данных, в соответствии с количеством заданым переменной $COPIES.
For /F «Delims=» %%i In (‘DIR /B/O:-N %$DST%\files. -??-??_??-??-. 7z’) Do (
Set /A $COPIES-=1
If !$COPIES! LSS 0 DEL «%$DST%\%%i»
)
Разберем подробнее. Автоматическое удаление реализуется путем организации цикла, в ходе которого перебирается набор имен (множество) файлов архивов (как оно формируется — см. чуть ниже строку DIR. )
В общем виде наш цикл имеет вид: for /F [«КлючевыеСловаРазбора»] <%% | %>переменная in (МножествоИменФайлов) do команда [ПараметрыКоманднойСтроки]
Ключ /F определяет, что цикл произведет разбор всех элементов множества «МножествоИменФайлов»;
«КлючевыеСловаРазбора» — указывают какие разделители используются между элементами разбираемого множества, в нашем случае — разделителя нет;
%%i — переменная i, которая содержит в каждый шаг итерации текущий элемент разбираемого множества (т.е. очередное имя файла в нашем случае).
Команда формирует набор (множество) имен файлов, содержащихся в папке заданной переменной $DST и соответствующих маске files. -??-??_??-??-. 7z, где знак вопроса обозначает любой символ в данной позиции; ключ /B задает вывод только имен файлов, а ключ /O:-N задает сортировку по имени (N) или в обратном порядке (-N), в нашем случае — порядок обратный.
Набор имеет вид:
files2010-07-01_22-00-00.7z
files2010-06-30_22-00-00.7z
files2010-06-29_22-00-00.7z
Обратите внимание на порядок сортировки элементов!
Do (. ) — в скобках содержится команда(ы), выполняемые в каждой итерации, в нашем случае:
Set /A $COPIES-=1 :: декремент переменной COPIES, выполняющей роль счетчика цикла;
If !$COPIES! LSS 0 DEL «%$DST%\%%i» :: команда проверяет условие $COPIES LSS 0 т.е. $COPIES echo %date% %time% ***End*** ::Вывод даты и времени окончания работы скрипта
Также приведу, для примера, содержимое файла-списка list_add.txt:
M:\mail
U:\updates
Z:\Бухгалтерия
Z:\Отдел*
z:\Справка
Z:\Сисадмин
И файла исключений list_excl.txt:
Собственно вот весь расклад. Скриптик маленький, но надежно работающий. Хитростей никаких нет, все достаточно просто.
Да и напоследок банальность… Для автоматизации запуска можно использовать стандартный планировщик Windows, командной строкой вида «d:\backup\backup.bat >> d:\backup\backup.log». Это позволит вывести сообщения скрипта в лог-файл.
Всем удачи.
2) Подробная справка по функциям консольной версии 7-Zip прилагается к архиватору.