Привет, Хабр!
Расскажу про 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».
Нужен карьерный апгрейд без боли для бюджета? Подписка OTUS: три курса на 6 месяцев, подстраиваете программу под свои задачи. Выбрать свой тариф
Комментарии (0)

mumische
22.09.2025 20:59И /mir ещё помогает быстро и без проблем удалять папки с дичайшим количеством файлов, на которых explorer делает "Крррр"

alkoro
22.09.2025 20:59Годная утиль, использую в различных вариациях в разных местах где то с 2004 года.
Однако, с приходом windows 8,10 эта утилита присутствует штатно в каталоге \system32 (\sysWOW64)
что привнесло некоторые коррективы в процессы автоматизации.Старые скрипты, работающие исправно даже в win7 с утилитой от 2003 года (версия 5.1.1) отказываются запукаться к примеру, в win10. Для это пришлось вносить доп. проверку наличия утили в system32 и перенаправлении вызовов.
Локализация RU. Хочешь или нет, help, вывод и вывод в логи будет с той локалью, которая установлена в системе. Масса анализаторов логов (robocopy) просто не видит ничего. Ладно, это обходится копированием \System32\en-US\Robocopy.exe.mui в \System32\ru-RU. Но даже после этого вывод лога неидентичен "оригиналу" (версий эпохи XP).

AndreyDmitriev
22.09.2025 20:59Ещё полезная опция (под Windows по крайней мере)
/XJ— Exclude Junction Points. С этой опцией robocopy будет пропускать символические ссылки и точки соединения каталогов (типа Application Data) , иначе оно может зациклиться, если весь диск C:\ начать копировать.
TijAY
robocopy, конечно, самый быстрый вариант из комплектных утилит. на уровне форка rsync для windows. вот только fastcopy уничтожает robocopy в любых сценариях.