Резервное копирование без лишних затрат
Итак, Вы системный администратор. У вас в хозяйстве есть некоторое количество разнообразного оборудования и серверов с произвольным набором данных. Вы отвечаете за работоспособность инфраструктуры, целостность данных и за очень многие вещи, о которых умалчивают должностные инструкции.
Как создать систему резервного копирования за очень дешево, а лучше всего вообще бесплатно?
Не буду заниматься рассмотрением теории, а просто поделюсь личным опытом.
Имеем типичную ситуацию: бюджетное учреждение, скромные зарплаты, старенькая техника, запланированного бюджета на ИТ нет совсем, покупки оборудования и программного обеспечения происходят от случая к случаю, когда в организации появляются какие-то деньги или когда прижимает уже окончательно. Необходимо обеспечить надежную и простую систему резервирования важных данных, попутно не разорив организацию, закупая самое лучшее программное и аппаратное обеспечение для решения этой проблемы. Отсутствие средств не избавляет от соблюдения уголовного законодательства и проверок соответствующих органов, поэтому все программное обеспечение, используемое в организации строго лицензионное. Решение проблемы резервного копирования с помощью «пиратского» программного обеспечения исключается.
Что хочется получить от системы резервного копирования?
Конечно же – получение резервных копий, желательно простым и понятным способом, гибкую настройку под потребности, простоту извлечения файлов и вменяемую цену за эти удовольствия.
Так уж исторически сложилось, что основной платформой на серверах и рабочих станциях нашей организации является Microsoft Windows различных версий. Поискав различные решения под эту платформу, попробовав разные программы, мы пришли к неутешительному выводу: купить удобное и надежное решение по резервному копированию мы пока не в состоянии. Бесплатные решения по тем или иным причинам нам не подошли. Был или неудобный формат хранения копий или неудобство настройки под наши нужды или что-то еще. Пробовали решения на Linux системах, но опыта эксплуатации этой операционной системы мало, хотя это конечно нас не оправдывает.
Обдумав сложившуюся ситуацию, решили пойти своим путем.
Еще до поиска подходящего решения была проведена полная ревизия того, что вообще следует резервировать. При этом попытались сами для себя ответить на следующие вопросы:
какие важные данные есть в организации?
где они располагаются?
как часто нужно делать резервную копию данных?
как долго ее нужно хранить?
После этого первого этапа у нас получилась небольшая таблица, содержащая обобщенную информацию о том, какие данные нужно хранить, где их собирать и краткое описание этих копий:

Таблица 1. Наборы данных для хранения.
Определив наборы данных для резервного копирования можно двигаться дальше. Попутно стало ясно, что все данные разные, многие требуют своего индивидуального подхода к сохранению. Если обычные файлы можно просто поместить в архив и его уже хранить как резервную копию, то с базой данных так поступить уже сложнее, нужно предварительно выгрузить данные и только потом помещать их архивную копию, или же предварительно остановить сервис конкретной базы данных и затем ее поместить в архив. Таким образом, требуется предварительная индивидуальная подготовка каждой резервной копии.
Резервные копии, как и куриные яйца, храниться в одной корзине не должны. Даже если эта корзина поддерживает RAID.
Было решено создавать многоуровневую систему резервирования – в нашем случае получилось 4 уровня.
Первый уровень – это копия данных, которая хранится в виде архива на том же сервере, где хранятся сами данные, но желательно это делать на разных дисковых массивах. При этом формируется архив, который потом передается на все остальные уровни хранения. Считаем что знание, какие данные извлечь и как это сделать — привилегия сервера, который является источником этих данных.
Второй уровень – данные копируются на другой физический сервер, назовем его основным хранилищем резервных копий. Это может быть специально выделенный сервер для резервных копий или любой другой компьютер, где есть свободное место. Мы решили создать выделенный сервер, обладающий достаточным количеством дискового пространства.
Таким образом, в пределах одной серверной комнаты было получено уже две копии данных. Но этого недостаточно для надежного хранения данных. Ситуации бывают в жизни разные, в том числе самые неприятные. Серверная может быть уничтожена на физическом уровне: пожар, затопление и прочие неприятности. Нужно хранилище за пределами данного помещения.
Третий уровень — был подготовлен еще один сервер, назовем его удаленное хранилище резервных копий. В нашем здании присутствует подвал с разной степени заброшенности помещениями и одна комнатка была размером ровно таким, чтобы установить туда 19 дюймовую стойку. Присутствовала система вентиляции, укрепленные стены и толстая металлическая дверь толщиной в сантиметр. Для чего она была предназначена изначально, истории не сохранилось, но под наши нужды подходила идеально. В комнату была установлена стойка с одним сервером и блоком бесперебойного питания. Если основная серверная комната будет уничтожена, то эта бронированная комнатка способна пережить даже обрушение здания. Помимо физической удаленности основной серверной от импровизированной, был предпринят еще один шаг – удаленный сервер выведен из рабочего домена, и в домене не осталось никаких учетных записей, которые бы имели доступ к ресурсам этого сервера. Таким образом, если учетная запись, под которой происходит резервирование данных, скомпрометирована (например, под ней будет запущен вредоносный код), то у нее не будет возможности попасть к третьей копии данных. Данные на этот выделенный сервер могут попасть только тогда, когда этот сервер сам заберет данные. Никаких открытых ресурсов для доступа снаружи, на этом сервере так же не осталось, только доступ удаленного рабочего стола с учетной записью самого сервера.
Четвертый уровень – для последнего уровня защиты было решено выделить несколько жестких дисков, на которые раз в несколько месяцев будут копироваться данные. Диски хранятся в сейфе и для копирования подключаются к одному из серверов с помощью док-станции. После копирования убираются обратно в сейф. Также эти диски можно хранить дома у одного из сотрудников, чтобы обеспечить большую территориальную изоляцию этих копий.
На каждом из этих уровней хранится не одна копия данных, а многодневные копии, которые накапливаются и удаляются по мере устаревания.
Перейдем к этапу реализации.
В качестве основного средства для создания резервных копий был выбран архиватор «7-zip». Программа довольно универсальная, обладающая огромными возможностями и совершенно бесплатная. Одной из возможностей является функция работы с файлами списками. Это обычный текстовый файл, в котором в виде текстовых строк перечисляются каталоги или файлы, для добавления в архив. Это дает возможность создания универсального скрипта для архивации, который никак не связан с самими данными, нужна только ссылка на текстовый файл с перечислениями нужных ресурсов.
Как уже упоминалось, данные на серверах самые разнообразные. Значит на сервере источнике данных нужен небольшой скрипт, который предварительно подготовит данные для архивации, а затем передаст управление универсальному скрипту, который и произведет действия по созданию архива, а также его передачу в соответствии с прописанными правилами на сервер основного хранения. Помимо всего, нам как «администраторам-параноикам» желательно бы знать, а все ли прошло хорошо в ходе архивации, т.е. нужна функция ведения логов процесса и отправка извещений об ошибках. Это тоже можно возложить на универсальный скрипт.
Основным хранилищем резервных копий назначен специально собранный сервер из второго уровня нашей градации, который также будет основным владельцем универсального скрипта, и именно на него будут поступать резервные копии с остальных рабочих серверов.
Окно для создания резервных копий для нашей организации приходится на ночные часы и выходные дни.
На сервере источнике данных, с помощью встроенного в операционную систему планировщика ночью запускается задание, которое сперва подготавливает данные к архивации (если это необходимо), а затем вызывает универсальный скрипт. Пример такого файла приведен ниже:
В первую очередь задаются параметры запуска универсального скрипта:
pBData – каталог, куда будут размещены копии необходимых скриптов, файл список с перечислением архивируемых ресурсов, а также подкаталоги с результатами резервного копирования и логи выполнения.
pNet – доступный сетевой ресурс на основном сервере резервного копирования, где хранятся резервные копии и универсальные скрипты.
pDate – дата формирования резервной копии, она будет присутствовать в имени формируемой копии и лог файлах.
Затем выполняется контроль версии универсального скрипта, если файл на клиенте не совпадает с расположенным на основном сервере резервного копирования, то файл будет обновлен. Скрипт копируется на сервер источник данных для того, чтобы если вдруг будет разорвана связь с основным сервером резервного копирования, сам процесс создания копии все равно был бы начат, вне зависимости от того, работает ли второй сервер в данный момент или нет.
После этих действий выполняется универсальный скрипт, при этом первым параметром передается «имя копии», в приведенном примере это «Budget».
Еще немного про структуру папок на сервере источнике данных. По адресу указанному в переменной pBData, должны быть созданы следующие подкаталоги:
— #_time_log – здесь будет создан файл с логами результатов выполнения резервного копирования.
— «имя копии» – каталог с именем создаваемой резервной копии, это же имя идет в качестве параметра при вызове универсального скрипта.
Также в этом каталоге должен быть файл «имя копии.ls». В нем в виде текстовых строк перечисляются каталоги, в которых расположены данные подлежащие резервированию.
На основном сервере резервного копирования по адресу из переменной pNet должны быть следующие файлы и подкаталоги:
— #_client – каталог, содержащий в себе файл универсального скрипта, а также еще несколько скриптов вызываемых в процессе работы универсального скрипта. Все файлы из этого каталога копируются на сервер источник данных и запускаются именно оттуда. Для обновления скрипта на всех клиентах – необходимо обновить его в данной папке. Во избежание ненужных проблем желательно к этой папке сделать доступ для клиентов только на чтение.
— #_time_log – каталог, в котором собираются логи о времени и результате выполнения резервного копирования со всех задействованных клиентов. Файл с логом называется по имени копии «имя копии.log». Также в этом каталоге располагается обобщенный лог «total_mail.log», на его основе формируется электронное письмо для отправки системному администратору.
Рассмотрим содержимое универсального скрипта «backup.bat»
В первой части файла определяются основные переменные. Если какое-то значение используется по тексту несколько раз, то совершенно логично сохранить это в виде переменной, это легче понимать и сопровождать.
Время хранения архивов на основном сервере резервного копирования прописано в универсальном скрипте в переменной «KOL_DAY_COPY», по умолчанию 5 дней.
Описание используемых параметров архиватора в виде комментариев также поместим в скрипт, это очень помогает при отладке, да и в дальнейшем будет понятно, что к чему без обращения к документации.
После формирования архива, получаем его размер в переменную fLen, для последующего анализа.
В переменных dStart, dEnd, tStart, tEnd запоминаем дату и время до и после архивации. Это поможет оценить время, затраченное на создание архива, что в дальнейшем помогает правильно составить расписание для запуска процедуры.
Для передачи архива с сервера источника данных на сервер основного хранилища резервных копий используется утилита «robocopy.exe». Если в системе данная утилита отсутствует, то нужно установить Microsoft Resource Kit 2003. Местоположение утилиты нужно прописать с помощью системной переменной PATH. Стандартная команда «xcopy» на больших файлах и по сети работает не стабильно.
К сожалению, пароль на создаваемый архив прописан в открытом виде внутри скрипта, но при грамотном разграничении доступа это не так страшно.
И третья часть универсального скрипта, уже заключительная – это сохранение логов и обработка архивов:
В ходе создания резервной копии создаются два файла с логами.
Первый файл это просто накопительный лог, в котором каждый день появляется новая строка, содержащая имя копии, дату и время начала, а также конца операции резервного копирования. В конце этой строки записывается размер копии.
Второй файл содержит строки с той же информацией, но по всем копиям подряд, в конце всех операций он попадает в почтовый ящик к системному администратору. Его по расписанию отправляет еще один скрипт, который здесь не описывается.
Один раз в неделю происходит копирование данных с основного хранилища резервных копий на удаленное хранилище резервных копий, которое расположено в изолированном помещении. Количество дней хранения на этом сервере ограничено размером дискового пространства. Если файл уже присутствует на удаленном сервере, он уже не копируется. Скрипт, который этим занимается, не приводится, он построен на основе предыдущего.
Для полноты картины осталось привести еще два файла, которые располагаются в каталоге «#_client» основного хранилища резервных копий.
Процедура отправки письма администратору оформлена в виде скрипта на Microsoft JScript «sendMail.js»:
Процедура удаления устаревших архивных файлов реализована на Microsoft VBScript (в данном случае этот язык выбран из-за более простой работы с датами), скрипт просматривает текущий каталог и удаляет все «*.7Z» файлы старше указанного количества дней.
Еще одним желательным пунктом ко всей проделанной работе станет небольшая табличка с расписанием запуска создания резервных копий на разных серверах. С помощью нее можно грамотно распределить время запуска так, чтобы они не мешались друг другу при копировании, поскольку все копии конечным своим пунктом должны попасть на основной сервер резервного копирования.
Пример расписания запуска процессов на серверах источниках данных приведено в следующей таблице:

Таблица 2. Расписание старта создания резервных копий.
Не считая затраты на аппаратное обеспечение (которое у вас уже наверняка есть), программная часть системы резервного копирования обошлась бесплатно. Мы получаем набор из полных ежедневных копий, глубиной столько дней, сколько укажем в настройках скрипта и насколько хватит доступного дискового пространства. Копии хранятся на нескольких серверах в сети. Их легко посмотреть и извлечь содержимое, для этого не нужно какого-то специализированного программного обеспечения, кроме архиватора. Копии защищены паролями.
Главный минус этого подхода в том, что копии полные и для больших, редко меняющихся данных этот способ неудобен. Механизм разностных копий реализуется чуть-чуть по-другому и эта тема уже другой статьи.
Использование Robocopy для синхронизации и резервного копирования файлов, примеры
25.11.2020
insci
Windows 10, Утилиты
комментариев 13
Robocopy – это консольная утилита Windows для копирования файлов, которую можно использовать для синхронизации/репликации файлов и каталогов, и в сценариях резервного копирования. Robocopy (Robust File Copy) доступна начиная с Windows NT 4.0 Resource Kit, но по умолчанию эта функция появилась только в Windows Vista и Windows Server 2008. Robocopy заменяет Xcopy и copy, как более функциональная.
Основные возможности Robocopy
Кроме обычного копирования файлов и папок из папки источника в каталог назначения, в Robocopy есть множество очень полезных функций:
- Устойчивость к обрывам сети (robocopy может продолжить копирования после восстановления сетевого доступа);
- Корректное копирование файлов с их атрибутами и NTFS правами доступа;
- Копирование с сохранением исходной временной метки;
- Возможность копирования файлов и директорий, запрещенных для доступа даже администратору, с помощью ключа /B (ключ позволяет игнорировать проверку прав доступа, ключ доступен только для участников группы Администраторы или Операторы архива);
- Возможность задать количество попыток копирования файла, если файл недоступен;
- Режим полного зеркалирования директорий;
- Пропуск уже существующих файлов (с одинаковым размером или временной меткой timestamp);
- Индикатор прогресса копирования;
- Корректная работа с длинными путями (более 260 символов);
- Эффективные алгоритмы и многопоточность позволяют выполнять копирование файлов намного быстрее, чем обычное копирование средствами Windows;
- Поддержка коды возврата (что позволяет использовать robocopy в различных внешних скриптах и утилитах).
Официальной графической версии robocopy (c GUI) от Microsoft нет. Существуют пользовательские версии, но их поддержка прекращена. Список неофициальных GUI для robocopy (это сторонние программы):
- EazyCopy
- RoboMirror
- RichCopy
Синтаксис и параметры robocopy
Robocopy имеет много параметров, которые на первый взгляд могут показаться сложными, но имея под рукой документацию, вы с легкостью разберетесь и сможете править скрипты под себя.
Синтаксис robocopy состоит из двух обязательных параметров (исходный и целевой каталог) и двух необязательных (фильтр файлов и параметры):
robocopy <source> <dest> [фильтр файлов] [параметры]
Поддерживаются как локальные пути, так и UNC, например, \\server\directory
Полный синтаксис утилиты robocopy (все параметры и их описания) доступны по команде:

Поскольку ключей в robocopy много, мы будем рассматривать их на практике, в готовых командах. Мы не будем рассматривать самые простые примеры использования robocopy, т.к. обычно они не вызывают вопросов. Ниже представлены готовые к применению более сложные команды robocopy, которые можно использовать в реальных сценариях.
Использование robocopy для зеркалирования каталогов
Вы можете зеркалировать (синхронизировать) содержимое двух каталог с помощью следующей команды robocopy (под зеркалированием понимается копирование файлов из целевой папки с удалением файлов в целевом каталоге, если они удалены в источнике).
robocopy \\testnode1\C$\source\ \\testnode2\c$\dest\ *.txt /MIR /COPYALL /Z /B /J /R:3 /W:1 /REG /TEE /LOG+:%appdata%\robocopy.log
- \\testnode1\C$\source\ — исходный каталог, откуда копируются файлы
- \\testnode2\C$\dest\ — каталог назначения, куда скопируются файлы
- *.txt – фильтр файлов. Синхронизируются только .txt файл и директории.
- /MIR – полное зеркалирование данных в source и dest директориях. Файлы, удаленные из source директории или не присутствующие в ней, также будут удалены из dest. Если вы хотите, чтобы удаленные из source файлы оставались в dest, то поменяйте параметр /MIR на /E
- /COPYALL – копирует всю информацию о файле (Атрибуты, параметры безопасности и т.д.). Как альтернатива, можно применять флаг /COPY:DT для копирования timestamp, а не всей информации. /COPALL требует прав администратора
- /Z – robocopy продолжит копирование файла при обрыве. Полезно при копировании больших файлов (неплохая альтернатива копированию файлов по BITS)
- /B – позволяет robocopy избегать ошибки access denied error. В этом режиме robocopy игнорирует все права на файлы, которые могли бы помешать прочитать/записать файл. Этот режим требует прав администратора либо участие в группе Операторы архива
- /J – Копирование без буфера (файлового кэша, оперативной памяти). Эффективно для больших файлов.
- /R:3 – количество попыток скопировать недоступный файл. Значение по умолчанию – миллион, поэтому необходимо его сменить.
- /W:1 – секунды между попытками скопировать недоступный файл. Значение по умолчанию – 30 секунд.
- /REG – сохранить текущие значения ключей /R и /W в реестр как стандартные, для будущих вызовов robocopy.
- /TEE – разделение вывода работы команды и в лог файл, и в консоль. При фоновом вызове robocopy (например, из планировщика задача) этот параметр можно убрать, оставив только /LOG
- /LOG – путь к файлу лога
Обратите внимание на ключ /Z даже если вы копируете небольшие файлы по устойчивому каналу. Он не несёт дополнительных расходов при использовании, но в случае обрыва, вы сможете продолжить копирование просто повторно запустив скрипт.
Инкрементальное копирование с помощью robocopy
Сам по себе robocopy не может полностью обеспечить инкрементальное резервное копирование каталога (копирование новых и измененных файлов), для этого мы будем использовать небольшой bat скрипт:
- set date_=%date:/=-% — эта строчка присваивает значение переменной date_ в формате DD.MM.YYYY
- /maxage:1 — Максимальный возраст файла. Исключает файлы старше N дней или даты. Дата указывается в формате YYMMDD, например, /maxage:20200421
- /E – копирует подпапки, без ограничения уровня вложенности. Для контроля уровня вложенности директорий можно использовать параметр /lev, например, /lev:3
Инкрементальность осуществляется за счёт параметра /maxage:1 — файлы старше суток копироваться не будут. Для первого, “базового” копирования, можно выполнить этот скрипт без параметра /maxage.
Robocopy: перемещение файлов
С помощью ключа /mov или /move вы можете переместить файлы (а точнее удалить успешно скопированные файлы из исходной директории):
robocopy C:\source\ F:\dest\ /MOVE /E /COPYALL /Z /B /J /R:3 /W:1 /REG /TEE /LOG+:%appdata%\robocopy.log
- /MOVE – удалить файлы и директории из исходной папки, после того как они были скопированы. Имейте в виду, что этот ключ нужно использовать вместе с /E или /S, в противном случае вы перенесете только файлы, но не директории. Если вы хотите перенести только файлы, используйте ключ /MOV
- Если вы используете ключ /MOVE с ключом /E, то вы перенесете все файлы, директории (включая файлы внутри них) и пустые директории. Файлы и директории удалятся из исходной папки. /MOVE с /S даст такой же результат, но пустые директории не перенесутся и будут удалены.
- Если вы используете ключ /MOV с ключом /E, то вы перенесете все файлы, включая те, которые находятся в директориях и поддиректориях, также скопируются все директории (включая пустые), но они не будут удалены из исходного каталога, в отличие от файлов. Используя /MOV с /S, вы получите такой же результат, но пустые директории не будут скопированы.
Пример использование robocopy в планировщике задач
Для примера возьмём задачу: нам необходимо с помощью robocopy регулярно синхронизировать содержимое сетевой папки между двумя серверами с ведением логов.
- Исходный путь — \\testnode1\C$\source
- Целевая директория- \\testnode2\C$\source
Запустите командную строку с правами администратора и введите: compmgmt.msc
Перейдите в System Tools -> Task Scheduler Library. Создайте новое задание планировщика (Create task).

Укажите имя задания, и выберите пользователя из-под которого будет выполняться задание. Пользователь должен иметь доступ на чтению и запись в обоих каталогах (при копировании по сети между серверами домена можно использовать аккаунт System, в этом случае нужно предоставить на целевой каталог права RW для объекта computer сервера-источника) .
Выберите опцию Run whether user is logged on or not, для того чтобы задание выполнялось в фоновом режиме. Также отметьте Run with highest privileges. Эта опция сработает если аккаунт из-под которого выполняется задание, будет иметь права администратора.

Перейдите на вкладку Triggers и создайте новый триггер.
Выберите параметр On a schedule (по расписанию), выберите время начала и отметьте Repeat task every, указав интервал выполнения. В моём случае это 5 минут – каждые 5 минут, начиная с часа дня 22 апреля (обязательно измените эту дату на ту, которая нужна вам), директории будут синхронизированы. В for a duration of поставьте Indefinitely (бесконечно)

Перейдите во вкладку Actions и нажмите New…
Выберите Start a program, и укажите путь к .bat скрипту.
Содержание robocopy-mirror.bat:
Помимо журнала выполнения задания планировщика, robocopy будет писать собственный лог файл копирования в C:\robocopy.log. Если аккаунт из-под которого будет выполняться скрипт не имеет прав администратора, смените C:\robocopy.log на нужный вам путь.

Остальные настройки заполнять не надо. После нажатия на кнопку ОК, вас попросит ввести пароль от учетной записи, которую вы выбрали для запуска задания.

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

Отслеживание изменений в каталогах с помощью robocopy
В robocopy есть встроенный механизм отслеживания изменений в исходном каталоге (и их последующего копирования) и встроенный планировщик – параметры /mon и /mot .
- /mon:N – проверяет исходную директорию на предмет изменений каждую 1 минуту, и если изменений в директории больше чем N, то будет произведено копирование в целевую директорию. Если задан параметр /mot:Y, то изменения будут проверяться каждые Y минут.
- /mot:N – проверяет исходную директорию на предмет изменений каждые N минут. Минимальное значение N = 1, в минутах. Если параметр /mon не задан, то будет считаться что /mon:1
.bat скрипт для зеркалирования с отслеживанием изменений с интервалом в 1 минуту. Этот скрипт нужно запускать из-под аккаунта с правами администратора.
Плюсы:
- Не нужно создавать задание в планировщике задач
- Подходит для непостоянного выполнения. Например, в течение нескольких часов, в таком случае запустить скрипт руками через CMD проще, чем создавать задание в планировщике
Минусы:
- Чтобы запустить .bat скрипт в фоновом режиме, нужно либо использовать VBS скрипт, либо стороннее ПО, например, NirCmd.
- Минимальный интервал поиска изменений и копирования – 1 минута. Для меньшего интервала нужно использовать PowerShell или bat скрипт.
Коды возврата (ошибки) robocopy
Ниже приведены стандартные коды возврата robocopy, которые можно использовать для обработки различных ошибок, которые возвращает утилита после выполнения действия копирования (кот возврата эта битовая маска).
| Hex | Decimal | Meaning if set |
| 0x00 | 0 | No errors occurred, and no copying was done. The source and destination directory trees are completely synchronized. |
| 0x01 | 1 | One or more files were copied successfully (that is, new files have arrived). |
| 0x02 | 2 | Some Extra files or directories were detected. No files were copied Examine the output log for details. |
| 0x04 | 4 | Some Mismatched files or directories were detected. Examine the output log. Housekeeping might be required. |
| 0x08 | 8 | Some files or directories could not be copied (copy errors occurred and the retry limit was exceeded). Check these errors further. |
| 0x10 | 16 | Serious error. Robocopy did not copy any files. Either a usage error or an error due to insufficient access privileges on the source or destination directories. |
| Коды возврата могут комбинироваться: | ||
| 0x03 | 3 | (2+1) Some files were copied. Additional files were present. No failure was encountered. |
| 0x05 | 5 | (4+1) Some files were copied. Some files were mismatched. No failure was encountered. |
| 0x06 | 6 | (4+2) Additional files and mismatched files exist. No files were copied and no failures were encountered. This means that the files already exist in the destination directory |
| 0x07 | 7 | (4+1+2) Files were copied, a file mismatch was present, and additional files were present. |
Любое значение больше 7 говорит о том, что при копировании через robocopy возникла ошибка. Вы можете обрабатывать эти ошибки в bat файле:
if %ERRORLEVEL% EQU 16 echo ***FATAL ERROR*** & goto end
if %ERRORLEVEL% EQU 15 echo OKCOPY + FAIL + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 14 echo FAIL + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 13 echo OKCOPY + FAIL + MISMATCHES & goto end
if %ERRORLEVEL% EQU 12 echo FAIL + MISMATCHES& goto end
if %ERRORLEVEL% EQU 11 echo OKCOPY + FAIL + XTRA & goto end
if %ERRORLEVEL% EQU 10 echo FAIL + XTRA & goto end
if %ERRORLEVEL% EQU 9 echo OKCOPY + FAIL & goto end
if %ERRORLEVEL% EQU 8 echo FAIL & goto end
if %ERRORLEVEL% EQU 7 echo OKCOPY + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 6 echo MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 5 echo OKCOPY + MISMATCHES & goto end
if %ERRORLEVEL% EQU 4 echo MISMATCHES & goto end
if %ERRORLEVEL% EQU 3 echo OKCOPY + XTRA & goto end
if %ERRORLEVEL% EQU 2 echo XTRA & goto end
if %ERRORLEVEL% EQU 1 echo OKCOPY & goto end
if %ERRORLEVEL% EQU 0 echo No Change & goto end
:end
Утилита robocopy имеет огромный функционал и позволяет гибко настроить операции копирования. Как альтернативу robocopy в PowerShell можно использовать командлет Copy-Item, который хоть и менее функционален, но работает с объектной моделью PowerShell, что может быть важно, если вы часто используете PowerShell или используете цепочки автоматизации с другими языками программирования.
Предыдущая статья Следующая статья
Robocopy — описание и примеры использования
Robocopy разработана для отказоустойчивого копирования каталогов и деревьев каталогов. Она обладает возможностью копирования всех (или выборочных) NTFS атрибутов и свойств, имеет дополнительный код для перезапуска при применении с сетевым соединением в случае его разрывов.
На сайте Microsoft доступна другая утилита RichCopy со схожими функциями.
Источник — Исходная папка (диск:\путь или \\сервер\общий ресурс\путь).
Назначение — Конечная папка (диск:\путь или \\сервер\общий ресурс\путь).
Файл — Копировать файлы (имена и подстановочные знаки: по умолчанию «*.*»).
Параметры копирования:
Ключи
/S :: Копировать вложенные папки, кроме пустых.
/E :: Копировать вложенные папки, включая пустые.
/LEV:n :: Копировать только верхние n уровней исходного дерева папок.
/Z :: Копирование файлов с возобновлением.
/B :: Копирование файлов в режиме архивирования.
/ZB :: используется режим с возобновлением; если доступ запрещен, используется режим архивации.
/EFSRAW :: Копирование всех зашифрованных файлов в режиме EFS RAW.
/COPY: флаги копирования :: что копируется для файлов (по умолчанию /COPY:DAT).
(флаги копирования: D=Данные, A=Атрибуты, T=Метки времени).
(S=Безопасность=NTFS ACLs, O=Сведения о владельце, U=Сведения аудита).
/DCOPY:T :: Копирование меток времени папки.
/SEC :: Копировать файлы с параметрами безопасности (эквивалентно /COPY:DATS).
/COPYALL :: Копировать все сведения о файле (эквивалентно /COPY:DATSOU).
/NOCOPY :: Не копировать никаких сведений о файле (удобно использовать с параметром /PURGE).
/SECFIX :: Исправлять параметры безопасности для всех файлов, даже пропущенных.
/TIMFIX :: Исправлять атрибуты времени для всех файлов, даже пропущенных.
/PURGE :: Удалять файлы и папки назначения, которых больше не существует в источнике.
/MIR :: Создать зеркало дерева папок (эквивалентно /E с /PURGE).
/MOV :: Перемещать файлы (удаление из источника после копирования).
/MOVE :: Перемещать файлы и папки (удаление из источника после копирования).
/A+:[RASHCNET] :: Добавлять заданные атрибуты скопированным файлам.
/A+:[RASHCNET] :: Удалять заданные атрибуты из скопированных файлов.
/CREATE :: Создать только дерево папок и файлы нулевой длины.
/FAT :: Создать файлы назначения только в формате 8.3 FAT.
/256 :: Отключить поддержку длинных путей ( > 256 знаков).
/MON:n :: Наблюдать за источником; перезапустить после n изменений.
/MOT:m :: Наблюдать за источником; перезапустить через m минут, если произошли изменения.
/RH:hhmm-hhmm :: Часы запуска — время, когда можно запускать новое копирование.
/PF :: Проверять часы запуска по файлам (не по проходам).
/IPG:n :: Интервал между пакетами (мс) для снижения нагрузки на сеть при низкоскоростных подключениях.
/SL:: копирование самих символических ссылок вместо копирования целевого объекта этих ссылок.
Параметры выбора файлов:
/A :: Копировать только файлы с установленным атрибутом «Архивный».
/M :: Копировать только файлы с атрибутом «Архивный» и сбросить его.
/IA:[RASHCNETO] :: Включить файлы, у которых установлен какой-либо из заданных атрибутов.
/XA:[RASHCNETO] :: Исключить файлы, у которых установлен какой-либо из заданных атрибутов.
/XF file [файл]… :: Исключить файлы, соответствующие заданным именам, путям и подстановочным знакам.
/XD dirs [папки]… :: Исключить папки, соответствующие заданным именам и путям.
/XC :: Исключить измененные файлы.
/XN :: Исключить более поздние файлы.
/XO :: Исключить более ранние файлы.
/XX :: Исключить дополнительные файлы и папки.
/XL :: исключить отдельно расположенные файлы и папки.
/IS :: Включить те же файлы.
/IT :: Включить оптимизированные файлы.
/MAX:n :: Максимальный размер файла — исключить файлы, размер которых более n байт.
/MIN:n :: Минимальный размер файла — исключить файлы, размер которых менее n байт.
/MAXAGE:n :: Максимальный возраст файла — исключить файлы, возраст которых превышает n дней.
/MINAGE:n :: Минимальный возраст файла — исключить файлы, возраст которых менее n дней.
/MAXLAD:n :: Наиболее поздняя дата последнего обращения — исключить файлы, которые не использовались с даты n.
/MINLAD:n :: Наиболее ранняя дата последнего обращения — исключить файлы, которые использовались после даты n.
(Если n < 1900, то n = n дней, в противном случае n — дата в формате ДДММГГГГ).
/XJ :: исключить точки соединения. (по умолчанию обычно включаются).
/FFT :: Использовать время файлов FAT (двухсекундная точность).
/DST :: Учитывать одночасовую разницу при переходе на летнее время.
/XJD :: Исключить точки соединения для папок.
/XJF :: Исключить точки соединения для файлов.
Параметры повторных попыток:
/R:n :: число повторных попыток для неудавшихся копий: по умолчанию — 1 миллион.
/W:n :: Время ожидания между повторными попытками: по умолчанию — 30 секунд.
/REG :: Сохранить /R:n и /W:n в реестре как параметры по умолчанию.
/TBD :: Ждать, пока будут определены имена общих ресурсов (ошибка повторной попытки 67).
Параметры ведения журнала:
/L :: Только список — файлы не копируются, не удаляются, не помечаются метками времени.
/X :: Сообщать обо всех дополнительных файлах, а не только о выбраных.
/V :: Подробный вывод с указанием пропущенных файлов.
/TS :: Включать в вывод метки времени исходных файлов.
/FP :: Включать в вывод полные пути файлов.
/BYTES :: Печатать размеры в байтах.
/NS :: Без размера — не заносить в журнал размер файлов.
/NC :: Без класса — не заносить в журнал классы файлов.
/NFL :: Без списка файлов — не заносить в журнал имена файлов.
/NDL :: Без списка папок — не заносить в журнал имена папок.
/NP :: Без хода процесса — не отображать число скопированных %.
/ETA :: Показывать оценку времени окончания копирования файлов.
/LOG: файл :: Записывать состояние в файл журнала (перезаписывать существующий журнал).
/LOG+: файл :: Записывать состояние в файл журнала (добавлять к существующему журналу).
/UNILOG: файл :: Записывать состояние в файл журнала в формате Юникод (перезаписывать существующий журнал).
/UNILOG+: файл :: Записывать состояние в файл журнала в формате Юникод (добавлять к существующему журналу).
/TEE :: Направлять выходные данные в окно консоли и в файл журнала.
/NJH :: Без заголовка задания.
/NJS :: Без сведений о задании.
/UNICODE :: Cостояние вывода в формате Юникод.
Параметры задания:
/JOB: имя_задания :: Взять параметры из указанного файла задания.
/SAVE: имя_задания :: Сохранить параметры в указанный файл задания
/QUIT :: Выйти после обработки командной строки (для просмотра параметров).
/NOSD :: Не указывается исходная папка.
/NODD :: Не указывается папка назначения.
/IF :: Включить следующие файлы.
Графический интерфейс
Robocopy является утилитой командной строки, поэтому для удобства пользования Microsoft Technet предоставляет графическую оболочку для неё (GUI front-end), автор которой Дерк Бениш. Оболочка требует наличия .NET Framework 2.0.
Обзор от Джошуа Хоффман (Joshua Hoffman) на TechNet
Скачать графическую утилиту с сайта MS
Robocopy exe что это

Утилита Robocopy для синхронизации и резервного копирования файлов
Robocopy – это встроенная консольная утилита Windows для копирования файлов, которую можно использовать для синхронизации/репликации файлов и каталогов, и в сценариях резервного копирования. Robocopy (Robust File Copy) доступна начиная с Windows NT 4.0 Resource Kit, но по умолчанию эта функция появилась только в Windows Vista и Windows Server 2008. Robocopy заменяет Xcopy и copy, как более функциональная.
Полный синтаксис утилиты robocopy (все параметры и их описания) доступны по команде в команд:

Использование robocopy для зеркалирования каталогов
Вы можете зеркалировать (синхронизировать) содержимое двух каталог с помощью следующей команды robocopy (под зеркалированием понимается копирование файлов из целевой папки с удалением файлов в целевом каталоге, если они удалены в источнике).
robocopy C:\katalog1\ D:\kataloge2\ /MIR /COPYALL /Z /B /J /R:3 /W:1 /LOG:robocopy.log
C:\katalog1\ — исходный каталог, откуда копируются файлы
D:\kataloge2\ — каталог назначения, куда скопируются файлы
/MIR – полное зеркалирование данных в source и dest директориях. Файлы, удаленные из source директории или не присутствующие в ней, также будут удалены из dest. Если вы хотите, чтобы удаленные из source файлы оставались в dest, то поменяйте параметр /MIR на /E
/COPYALL – копирует всю информацию о файле (Атрибуты, параметры безопасности и т.д.). Как альтернатива, можно применять флаг /COPY:DT для копирования timestamp, а не всей информации. /COPALL требует прав администратора.
/Z – robocopy продолжит копирование файла при обрыве. Полезно при копировании больших файлов (неплохая альтернатива копированию файлов по BITS)
/B – позволяет robocopy избегать ошибки access denied error. В этом режиме robocopy игнорирует все права на файлы, которые могли бы помешать прочитать/записать файл. Этот режим требует прав администратора либо участие в группе Операторы архива.
/J – Копирование без буфера (файлового кэша, оперативной памяти). Эффективно для больших файлов.
/R:3 – количество попыток скопировать недоступный файл. Значение по умолчанию – миллион, поэтому необходимо его сменить.
/W:1 – секунды между попытками скопировать недоступный файл. Значение по умолчанию – 30 секунд.
/LOG – путь к файлу лога
Использование Robocopy для перемещения файлов
С помощью ключа /mov или /move вы можете переместить файлы (а точнее удалить успешно скопированные файлы из исходной директории):
robocopy C:\katalog1\ D:\kataloge2\ /MOVE /E /COPYALL /Z /B /J /R:3 /W:1 /LOG:robocopy.log
/MOVE – удалить файлы и директории из исходной папки, после того как они были скопированы. Имейте в виду, что этот ключ нужно использовать вместе с /E или /S, в противном случае вы перенесете только файлы, но не директории. Если вы хотите перенести только файлы, используйте ключ /MOV