Привет, Хабр!

Расскажу про Robocopy — утилиту Windows для апдейтнуого копирования. Она живёт в системе с Windows Vista (раньше была частью NT4 Resource Kit) и предназначена для работы с большим количеством файлов. Robocopy используется для копирования файлов. Часто её используют для миграции файловых серверов или резервного копирования. По сути это более навороченная замена привычным COPY/XCOPY: она поддерживает возобновление копирования, зеркалирование каталогов, многопоточность и многое другое.

Основные возможности

Robocopy умеет продолжать копирование после обрывов сети. Если при передаче данных произошло отключение, Robocopy запомнит, где остановилась (подвешенные файлы помечаются датой 01.01.1970 и содержат информацию, с какого места продолжить). По дефолту утилита сохраняет все атрибуты файлов и папок, а также NTFS‑разрешения (ACL) и временные метки. К примеру, параметр /B позволяет обойти любые ограничения доступа (получить права резервного копирования) и всё равно скопировать файл.

Есть специальный режим зеркалирования (ключ /MIR), который синхронизирует две папки: ненужные файлы из назначения будут автоматически удалены. При этом стандартное поведение Robocopy — пропускать уже скопированные файлы, если их размер и время модификации не изменились. Ещё из плюсов — индикатор прогресса и очень корректная работа с длинными путями. Windows Explorer банально не умеет считать файлы с путями длиннее 260 символов, а Robocopy спокойно с ними справляется (фича /256 даже позволяет отключить поддержку длинных путей, если это нужно).

Еще есть функция многопоточного копирования (/MT:<n>). С Windows 7/Server 2008 R2 можно указать сразу несколько потоков — и копирование пойдёт заметно быстрее на многоядерных системах. Утилита выдаёт код возврата (exit code), чтобы автоматические скрипты могли проверить успех операции. Например, 1 — все файлы скопированы, 0 — ничего копировать не пришлось (всё уже есть в папке назначения), а коды ≥8 сигнализируют о сбоях.

Синтаксис команды

Конструкция команды robocopy очень простая:

robocopy <source> <destination> [<fileFilter>] [<options>]

Где <source> — исходный каталог, <destination> — конечный, а через <fileFilter> можно указать маску файлов (по умолчанию .). Путь может быть как локальным, так и сетевым (UNC, например \\server\share\). Утилита живёт в %SystemRoot%\System32, просто вызывайте robocopy из командной строки или BAT«ника.

Если вы копируете файлы из корня диска (например, robocopy C:\ D:\Backup), то папке назначения присваиваются атрибуты Hidden и System. Учтите это, если вдруг папка исчезнет из обзора — снимите эти атрибуты вручную.

Разберём основные опции:

  • /E — копирует все подпапки, включая пустые (то есть без ограничений по вложенности). Если убрать E и взять просто /S, будут скопированы все подпапки, кроме пустых.

  • /Z — копирует в режиме перезапуска. Т.е если копирование прервётся, можно запустить команду снова, и она продолжит с места обрыва.

  • /B — копирует в режиме резервного копирования, игнорируя параметры доступа. Без этого некоторым файлам доступ может быть отказан. Можно сочетать /ZB, тогда Robocopy сначала попытается /Z, а при отказе переключится на /B.

  • /COPY:flags — указывает, что копировать. По умолчанию это DAT (Data, Attributes, Timestamps). Есть и более «толстые» варианты. Ключ /COPYALL эквивалентен DATSOU (все доступные данные: данные, атрибуты, временные метки, ACL, владельцы, аудит). Если нужна большая скорость, оставьте /COPY:DAT.

  • /R:n и /W:n — число повторов при ошибке и задержка в секундах между ними. По умолчанию Robocopy готово повторить 1 000 000 раз и ждать 30 секунд! Обычно стоит явно прописать /R:3 /W:5, чтобы не ждать вечность. Можно сохранить эти значения в реестре ключом /REG.

  • /MIR — полностью зеркалирует структуру (что эквивалентно /E + /PURGE). Будьте осторожны: все файлы, которых нет в исходнике, удалятся из папки назначения. Если вы не хотите удалять лишние файлы, то есть просто /E (без /PURGE).

  • /MOV и /MOVE — после копирования удаляют файлы (и директории с /MOVE) из источника. Например, robocopy C:\src D:\dst /E /MOVE перенесёт файлы и папки, а потом удалит их из C:\src. Эти ключи удаляют файлы безвозвратно после копирования — используются, когда нужно переместить данные.

  • /MT:n — многопоточное копирование: число потоков n (от 1 до 128, по умолчанию 8). /MT нельзя сочетать с /IPG или /EFSRAW.

  • /XF <file> и /XD <dir> — исключают указанные файлы/папки. Поддерживаются подстановки и ?. Например, robocopy C:\src D:\dst /E /XF .tmp /XD \temp пропустит все .tmp и папку \temp.

  • /MAXAGE:n и /MINAGE:n — фильтруют по дате изменения. /MAXAGE:7 допустит только файлы младше 7 дней, /MINAGE:20230101 — только файлы старше указанной даты. Аналогично /MAX: и /MIN: задают ограничения по размеру.

И несколько полезных: /NFL//NDL//NP выключают различные части вывода (имена файлов, каталоги, индикатор прогресса) — когда хочется чистый лог. /TEE выведет лог и в консоль, и в файл одновременно. /ETA покажет оценку времени завершения текущей копии каждого файла.

Отмечу еще пару опционо». Если копируете по медленной сети, можно задать паузу между пакетами /IPG:n или ограничение пропускной способности /IORMAX:n, /IORATE:n. Также, если источник или цель не NTFS, стоит добавить /FFT — это учитывает двухсекундную точность временных меток FAT. Для сухого прогона есть /L: она ничего не копирует, а лишь выводит, что было бы скопировано.

Примеры

Перейдём к примерам.

1. Базовое копирование со всеми подпапками. Пусть нам нужно скопировать содержимое папки (включая все вложения, даже пустые папки) в резервную локацию, сохранив метки времени и права. Одной из самых частых комбинаций будет что‑то вроде:

robocopy C:\Data\Source D:\Backup /E /Z /MT:8 /R:3 /W:5 /LOG:C:\Logs\Backup.log

Здесь /E — копировать все подпапки (и пустые), /Z — в режиме перезапуска (для надёжности на случай обрыва), /MT:8 — 8 потоков копирования, /R:3 /W:5 — три попытки и 5 секунд ожидания, а /LOG: сохраняет отчет. Таких команд можно накидать в любо́й батник — она работает и локально, и по сетевому пути.

2. Зеркалирование двух папок. Если нужно синхронизировать папки «документ‑резерв», в ход идёт /MIR. Она скопирует всё из исходника в цель и удалит лишнее в цели. Например:

robocopy C:\Data\Source D:\Backup /MIR /R:2 /W:5 /LOG:C:\Logs\Mirror.log

Эта команда полностью зеркалит Source и Backup. Обратите внимание: файлы, которых нет в Source, удалятся из Backup. Если такого поведения не хотим, есть просто /E без /MIR.

3. Фильтрация по возрасту. Нередко нужен инкремент: копировать только новые файлы. Робокопи сама не хранит историю, но можно заложить логику через /MAXAGE или скрипт. Например, чтобы скопировать только файлы младше 7 дней:

robocopy C:\Data\Source D:\Backup /E /MAXAGE:7 /LOG:C:\Logs\Inc.log

С /MAXAGE:7 попадут файлы, измененные не позже, чем 7 дней назад. Аналог из официальных примеров (учтён ещё /MOV):

robocopy C:\Data\Source D:\Backup /S /MAXAGE:7 /MOV /LOG:C:\Logs\IncMove.log

Опция /MOV удалит исходные файлы после копирования (используйте её только если уверены).

4. Отбор и исключение файлов. Можно копировать выборочно. Допустим, в каталогах есть .tmp, их не нужно. Используем /XF .tmp. Или наоборот — /XA:R чтобы исключить только‑файлы только для чтения. Пример:

robocopy C:\Data\Source D:\Backup /E /XF *.tmp /XD \Temp /LOG:C:\Logs\Filtered.log

С этой командой все .tmp и папка Temp будут пропущены. Ещё вариант — тянуть только нужные расширения: robocopy ... .txt .docx.

5. Многопоточность и скорость. Чтобы прокачать скорость, можно увеличить число потоков. Например, при копировании очень большого архива:

robocopy C:\BigData D:\BigBackup /E /MT:32 /LOG:C:\Logs\Big.log

32 потока — будет быстрее, чем обычный /MT:8. Учтите, что при очень большом /MT нагрузка на диск может вырасти, и журналы лучше выводить в /LOG (чтобы консоль не тормозила). А чтобы не забить сеть, есть флаги /IPG и /IORATE. Например, robocopy ... /IORATE:1m ограничит I/O до ~1 МБ/.

6. Перемещение и чистка. Если нужно не копировать, а переместить (каскадно удалить из источника), то используем /MOVE и /MOV. К примеру:

robocopy C:\Data\Old D:\Archive /E /MOVE /LOG:C:\Logs\Move.log

После этого в C:\Data\Old останется только структура каталогов (без файлов). Опция /MOVE удаляет и файлы, и папки (а /MOV — только файлы). В любом случае — всегда внимательно: удаление в источнике произойдёт безвозвратно после копирования.

7. Журналирование. Рекомендую всегда писать лог: ключ /LOG:файл (перезаписывает) или /LOG+:файл (дозаписывает). Так можно в конце проверить, сколько скопировано/пропущено файлов. Если же нужен только вывод без копирования, используйте /L (dry run).

Нюансы

Пути длиной >260 символов. Как выяснилось, Explorer их не считает, но Robocopy справляется, если не указывать /256. Копируй длинные пути спокойно — Explorer за тебя статистику не посчитает, зато Robocopy спокойно перенесёт файлы по пути \\?\.... Если вдруг нужна строгость, /256 отключает обработку >256 символов.

Файлы в использовании. Если при копировании появляются Access Denied (файл занят), Robocopy в стандартном режиме повторит копию миллион раз. Лучше заранее закладывать /R и /W, и/или запускать в момент наименьшей нагрузки (тихий час) или снапшотом VSS.

Файловые системы. Если целевая или исходная папка на FAT/SSD без NTFS, параметр /FFT даст двухсекундную точность времени, иначе Robocopy может считать незначительно изменившиеся файлы новыми.

Угрызения совести. Опции типа /MIR и /MOVE влияют на файлы — не забудьте сделать тест (например, в пустой папке) перед продакшн‑запуском. Можно вообще сначала выполнить команду с /L (dry run), посмотреть, что будет сделано, и лишь потом убирать /L и запускайте по‑настоящему.

Коды возврата. После копирования советую проверять %ERRORLEVEL%. Коды от 0 до 7 — можно интерпретировать как «успешно (с разной степенью)», а 8 и выше — ошибки.

Robocopy не заменит GUI‑бекапы, но в сценариях скриптов и администрирования проявляет себя великолепно. Подытожим: чтобы начать, достаточно базового синтаксиса (как у COPY), но за спиной Robocopy — полноценный набор инструментов: зеркалирование, мультипоток, возобновление, фильтрация, и даже сжатие SMB‑соединения при передаче (ключ /compress).


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

Отзыв студента курса Администратор Windows
Отзыв студента курса Администратор Windows

Если вы хотите системно изучить администрирование Windows и освоить навыки работы с сервисами и инструментами ОС, приглашаем вас на курс «Администратор Windows».

Нужен карьерный апгрейд без боли для бюджета? Подписка OTUS: три курса на 6 месяцев, подстраиваете программу под свои задачи. Выбрать свой тариф

Комментарии (0)