Скрипт резервного копирования файлов bat

Обновлено: 05.07.2024

Программ для создания резервных копий (backup, бэкап) великое множество. Есть и платные, есть и бесплатные. В некоторых используются «мастера», которые позволяют указать массу параметров, не прибегая к сложному процессу настройки.

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

  • выбор исходных данных (каталог, файлы);
  • выбор куда копировать (каталог);
  • непосредственно копирование.

Для того, чтобы скопировать файл/каталог используется команда xcopy. Она имеет много параметров, но в общем случае указывается так:

Данная команда скопирует каталог «d:\myfiles» в «j:\backup\myfiles».

Итак наши действия очень просты. Вначале откроем Notepad2. В нем нужно указать те каталоги, которые следует резервировать. Лично у меня важные данные хранятся в нескольких каталогах: «txt», «work» и т.д.

Вторым параметром мы указываем куда следует скопировать. Обычно я для резервирования использую внешний жесткий диск (USB).

Для того, чтобы Windows при каждом его подключении присваивала одну и ту же букву диска, нужно войти в Панель управления - Администрирование - Управление Компьютером - Управление дисками. На подключенном диске кликните правой кнопокй мыши и выберите «Изменить букву диска или путь к диску. ». В открывшемся окне выберите «Изменить» и укажите нужную букву. Например, у меня указано «J».

Для удобства лучше сохранять имена каталогов, чтобы потом не запутаться. А сам бэкап я размещаю в отдельном каталоге «backup».

Алгоритм копирования будет таков: мы будем копировать только новые файлы, старые будут затираться. При этом мы не будем удалять уже несуществующие в исходном каталоге файлы. Всё это достигается указанием параметров для xcopy.

Вот рабочий пример резервирования кошельков WEBMONEY и Яндекс-Деньги:

Эти строки нужно скопировать в Notepad2 и сохранить в файле с расширением «.bat», например «backup.bat». Теперь нам достаточно только запустить его и все будет сделано автоматически.

Теперь обратите внимание, что пути мы указываем в кавычках «"» - это требование Windows для длинных имен. Каталоги разделяются обратным слэшем «». В конце указываются параметры для xcopy.

То есть вам нужно только указать ваши каталоги для резервирования и сохранить как «backup.bat». Вы можете сделать несколько таких файлов: процесс копирования может иногда занимать много времени, поэтому какие-то совсем критичные данные я копирую чаще - для них существует другой файл «QiuсkBACKUP.BAT».

Естественно вам нужно следить за тем, чтобы на приёмном диске было достаточно места.

Теперь следующий момент, с которым вы можете столкнуться - неверная кодировка текста. Дело в том, что русские буквы для DOS (где и происходит копирование) отличаются от Windows (где вы создали bat-файл). Например у меня есть каталог «c:\Избранное». Если я запущу bat-файл, то ничего не произойдет, поскольку xcopy его просто не найдет. Поэтому наш bat-файл нужно преобразовать в DOS-кодировку (её часто называют «OEM»).

Для этого мы выделяем такие строчки в Notepad2 и жмем Ctrl+Shift+O (или Edit - Convert - To OEM Text). Вы увидите «белиберду», но не пугайтесь, так и должно быть. В моем примере это выглядит так: «c:?§Ўа ­­®Ґ»

Если у вас есть Total Commander, то вы можете просмотреть этот файл по F3 и в просмотрщике переключить кодировку - клавиша «S».

Следующая задача, которой я не пользуюсь, но возможно вам пригодится - это копирование актуальной версии каталога, а старый бэкап переименовывается в «old».

Здесь задача совсем несложная: вначале нужно удалить старый «old», после этого переименовать текущий бэкап в «old» и скопировать как обычно xcopy. Вот пример резервирования каталога «c:\work»:

Команда «del» удаляет все файлы из каталога. Команда «rmdir» удаляет пустой каталог. Команда «rename» переименовывает файлы. А командой «xcopy» мы, как обычно, копируем файлы.

code

Набросал ещё один маленький BAT скрипт для резервного копирование папки. Внесите свои данные и через scheduler настройте расписание резервного копирования.

Ссылки

Функции

  • С помощью xcopy делает резервные копии папки.
  • Каждый бэкап сохраняется в отдельную подпапку вида DD.MM.YYYY_hhmmmss.
  • С помощью 7-Zip архивирует резервные копии.
  • Удаляет старые резервные копии.
  • DirName - название папки
  • SourceDir - что бэкапим
  • BackupDir - куда бэкапим
  • NumFolders - сколько подпапок с бэкапами хранить
  • a7z - путь к 7z.exe

Пример настройки расписания

В Task Scheduler настраиваем новое задание.

bat

Выбираем пользователя, от имени которого будет выполняться резервное копирование. После сохранения задания нас спросят пароль от него. Ставим галку Run whether user is logged or not - запускать даже если юзер не залогинен.

bat

В триггерах настраиваем расписание. У меня резервное копирование происходит раз в сутки.

bat

Указываем ссылку на наш BAT файл.

bat

bat

Проверяем настройки. OK.

Теперь папка будет резервироваться раз в день. С настройкой NumFolders=10 в BAT файле мы будем хранить данные за последние 10 дней.

Если хотите хранить ежедневные и ежемесячные резервные копии - сделайте два BAT файла и два расписания резервного копирования в разные папки.

Батник для архивирования файлов и папок. Бэкап 1С баз.

Сейчас я расскажу о том, как при помощи bat-файлов можно архивировать файлы и папки как на локальном компьютере, так и в сети организации.

Внимание. Для использования данного метода архивирования у Вас на компьютере должна быть установлена программа WINRar.

Рассмотрим пока самый простой вариант архивирования записью в одну строчку.

. При копировании кавычки надо переписать (поменять).

Теперь коротко о том что тут написано

Вот что бывает без указания параметра chcp 1251

По факту можно создать файл с расширением *.bat, сохранить в нем одну строчку и все будет работать. Но это всего лишь одноразовый и не удобный вариант.

Присвоение архиву даты создания. Автоматическое архивирование батником.

0,2%
set month=%DATE:

3,2%
set year=%DATE:

Заметьте, что переменные времени добавляются в том месте, где указывается путь к архивному файлу и его название. Варьировать местами год, месяц и день можете на свое усмотрение.

Архивирование с заданным количеством бэкапов (архивов)

К примеру, Вы захотели, чтобы у Вас всегда был архив за три последних дня.

Для такого метода бэкапа Вам понадобится, своего рода, временное хранение архивного файла. Проще говоря, папка отличная от места хранения основных бэкапов.
Вот как будет выглядеть весь скрипт:

0,2%
set month=%DATE:

3,2%
set year=%DATE:

В итоге у нас получилось 3 архива в папке, последний из которых с указанием даты создания

Как видите, я создал отдельную папку D:\timearh для основного временного архива.

if exist D:\arhiv\papka_03*.rar del D:\arhiv\papka_03*.rar
if exist D:\arhiv\papka_02*.rar ren D:\arhiv\papka_02*.rar papka_03.rar
if exist D:\arhiv\papka_01*.rar ren D:\arhiv\papka_01*.rar papka_02.rar

Эти три команды нужды ля переименовывания основных файлов в сторону увеличения четности и удаления самого последнего файла, в нашем случае третьего. По сути, количеством этих строчек Вы и регулирует общее количество создаваемых архивов. Для увеличения бэкапов достаточно лишь дописать нужное количество строчек и не забыть переименовать порядок.

Данный вариант идеально подходит для бэкапа 1С баз. Он полностью автоматизирован, можно спокойно хранить месячный (а то и больший) архив баз.


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

Пусть задача будет звучать следующим образом:

  1. Как продолжение предыдущего пункта, формат архива также должен быть открытым и распространенным, чтобы в случае чего его без проблем открыть откуда угодно с помощью чего-угодно
  2. Более того, он должен быть таким, чтобы из любого, даже дифференциального архива, можно было бы без труда вытащить любой файл, не распаковывая для этого весь архив.
  3. Глубина архивации должна настраиваться (что называется, backup rotate).
  4. Было бы неплохо также с архивом сохранять дескрипторы безопасности NTFS.
  5. И вообще, хочется максимальной расширяемости и настраиваемости, если завтра возникнет желание нагородить дополнительный функционал.

Выбор средств

Поскольку сторонние средства мы решили отметать, то как такового выбора технологий у нас почти не остается:

Глубоко вздохнув, приходится делать шаг в сторону от одного из вышеозначенных принципов и взять на роль архиватора готовое решение. С точки зрения опенсорсности и бесплатности опять же практически безальтернативно выбор падает на:

План алгоритма

Скрипт

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

Для работы скрипта мы должны заполнить выделенный в начале файла блок переменных (пути архивации, глубина хранения архивов) и создать файл с папками-источниками, например, такой:

Использование

Убедившись, что всё работает (или поправив параметры, если нет) создаём задание в планировщике (отдельно для полного копирования и отдельно для дифференциального).

Экспортированный пример задания: scheduled-backup-task-full.xml

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

Замечания

  • Для корректной работы (в первую очередь для создания теневой копии) powershell должен быть запущен от имени администратора (или «с наивысшими привилегиями» в терминологии планировщика заданий).
  • По идее способ также годится для горячего консистентного резервного копирования хоть баз MSSQL, хоть MS Exchange (при установке соотв. shadow copy providers, которые к подобному софту идут в комплекте), хотя конкретно в этих случаях удобнее пользоваться встроенными средствами.
  • Инкрементным резервным копированием я не пользуюсь (много хлопот найти удаленный файл среди кучи инкрементных архивов), но если возникнет потребность, то он получается буквально комбинированием нескольких срочек из полного и дифференциального блоков скрипта.
  • Здесь также не реализован механизм сохранения ACL (формат zip, да и 7zip не поддерживают хранение дескрипторов безопасности в архиве; RAR умеет, но это уже не свободное ПО, что сильно противоречит условиям задачи). В случае необходимости дескрипторы можно сохранять в файл встроенными утилитами типа icacls и добавлять полученный дамп в создаваемый архив.
  • Увы и ах, алгоритм не подходит для XP/2003. Сложность возникает на моменте создания ярлыка на теневую копию (в этих ОС нет утилиты mklink, а по-быстрому обойти эти грабли у меня не вышло).

Перед необходимостью изобретать свой велосипед автор за несколько лет намучался перепробовал большое количество разнообразного бесплатного готового ПО со похожей функциональностью (Cobian Backup, COMODO Backup и др.). Вдоволь находившись по разнообразным встроенным в упомянутый софт граблям, было принято решение написать что-то своё. На данный момент описанное решение успешно работает на серверах (Windows Server 2008 R2) и рабочих станциях (Windows 7 и Windows 8.1).

комментарии ( 41 )

Под XP/2003 для создания линков скорее всего поможет утилита junction
  1. junction не входит в комплект XP/2003.
  2. При попытке скормить ей путь до теневой копии (вида "\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\"), ругается на то, что якобы данный том имеет файловую систему отличную от NTFS и ярлык не создает.
  • Bareos server components run on Windows now
  • Better VSS support Volume Mount Points (VMP) supported
  • Windows Encrypted Filesystems (EFS) supported
  • Windows Dedup Support
  • System Registry key 'NotToBackup' supported
  • New installers for pre- and post Vista Windows versions
Да, но зачем? Чем не устраивает встроенная в Windows система архивации? Для Bare-Metal бекапа еще ничего, но есть у нее ограничение. На сетевое хранилище только FullBackup. Подключаете сетевое хранилище по iSCSI и делаете инкрементальные бекапы. Зачастую он устраивает, но не всегда:
1. Конкретно iSCSI не всегда подходит для домашнего применения, да и в корпоративной инфраструктура не всегда имеется.
2. Также часто хочется дополнительного функционала (прикрутить оповещения на почту или еще что).
3. Если нужно бэкапить не весь том целиком, а лишь отдельные каталоги, то встроенная система этого делать не умеет.
4. Плюс, если просто всё бэкапить в один образ, так как это делает Windows Image Backup (и полные, и дифф. бэкапы), то потом возникают сложности с мониторингом наличия файлов бэкапа (когда создается по одному файлу на каждый день, гораздо проще контролировать, когда и какие копии не создались, какие создались, но почему-то оказались пустыми архивами (например, кончилось место на целевом диске) и т.п.).
1. Конкретно iSCSI не всегда подходит для домашнего применения, да и в корпоративной инфраструктура не всегда имеется.

FreeNAS вам в помощь. А в домашней инфраструктуре бекапы вообще можно делать на подключенный локальный диски.

2. Также часто хочется дополнительного функционала (прикрутить оповещения на почту или еще что).
3. Если нужно бэкапить не весь том целиком, а лишь отдельные каталоги, то встроенная система этого делать не умеет.
4. Плюс, если просто всё бэкапить в один образ, так как это делает Windows Image Backup (и полные, и дифф. бэкапы), то потом возникают сложности с мониторингом наличия файлов бэкапа (когда создается по одному файлу на каждый день, гораздо проще контролировать, когда и какие копии не создались, какие создались, но почему-то оказались пустыми архивами (например, кончилось место на целевом диске) и т.п.).


FreeNAS вам в помощь. А в домашней инфраструктуре бекапы вообще можно делать на подключенный локальный диски.

Тут мы уходим немного в оффтоп, а точнее, в вопросы подходов построения ИТ-инфраструктуры :)
Нагородить iSCSI ТОЛЬКО ради функции дифференциального/инкрементного бэкапа в моем случае неоправданное роскошество. Наколенный файловый zip-бэкап поддерживать/разворачивать/и т.д. может и рядовой эникей после 10-минутного инструктажа. Разобраться с какой-либо проблемой NAS4Free, OMV и подобн. софтовых таргетов потребует привлечения сисадмина более высокого уровня. Итого при прочих равных (если нам не нужна time machine и состояние каждого файла на любой момент времени) стоимость владения инфраструктурой в описанном вами случае выше.

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

Я понимаю о чем вы, у этого подхода есть как плюсы, так и минусы.
Как в этом случае без лишней головной боли убедиться, и делать это на ежедневной основе в автоматическом режиме, что у меня на NN серверах, на которых делается такой бэкап, действительно наличествуют все резервные копии за все дни согласно политикам резервного копирования? Подчеркиваю: хотелось бы убедиться не только в том, что процесс копирования прошел без ошибок, а в том, что копия действительно существует и из нее, опять же, при желании автоматически без разворачивания образа извлекается любой маркерный файл с референсным содержимым для проверки на битость или еще какие неприятности (согласитесь, разница с простым созерцанием колонки надписей «Successful» имеется; да, такие мы параноики).

В качестве бонуса для дополнительного контроля хочется наглядно видеть объемы каждой полной и дифференциальной копии (видеть тенденции роста ну и вообще бывает полезно посмотреть что где внезапно распухло). Не исключаю, что сделать это как-то можно и в вашем случае, подкопавшись к создаваемому WIB-снимку через какой-нибудь API, но этот способ точно не будет проще ситуации «файл на каждый день».

Читайте также: