Зачем robocopy, если есть копирование в проводнике
Robocopy входит в состав современных версий Windows и запускается из командной строки или PowerShell. Основное отличие от копирования мышью в том, что команда не останавливается на первой же ошибке и не задаёт вопросов в диалоговых окнах. Она пытается скопировать каждый файл, а затем выдаёт итоговую таблицу: сколько каталогов и файлов было, сколько скопировано, пропущено и сколько завершилось сбоем.
Второе преимущество в том, что при повторном запуске по тем же путям robocopy сравнивает файлы и не переписывает те, что уже совпадают по размеру и времени изменения. Поэтому тот же вызов подходит и для первого переноса, и для дозаливки после обрыва. Для разового копирования пары документов это избыточно, а для переноса каталога с фотографиями или рабочими проектами на другой диск удобно.
Общий вид команды такой: robocopy откуда куда [файлы] [ключи]. Если файлы не указаны, берутся все. Обратите внимание, что в качестве источника и приёмника указываются именно папки, а не конкретные файлы; имена файлов задают третьим параметром, например *.docx.
Первая команда и порядок параметров
Минимальный рабочий вариант выглядит так: robocopy C:\Projects D:\Backup\Projects /E. Источник здесь C:\Projects, приёмник D:\Backup\Projects, а ключ /E говорит копировать подкаталоги, включая пустые. Если приёмника нет, команда создаст его сама. Пути с пробелами берите в двойные кавычки, а завершающий обратный слеш перед закрывающей кавычкой лучше не ставить, потому что в этом месте кавычка может быть прочитана неверно.
Без ключа /E и без /S копируются только файлы из верхнего уровня источника, подпапки остаются нетронутыми. Эта особенность часто удивляет тех, кто впервые запускает команду и находит в приёмнике лишь часть содержимого.
Чтобы выбрать только определённые файлы, добавьте маску после путей: robocopy C:\Docs D:\Docs *.pdf *.docx /E. Исключить каталоги или файлы можно ключами /XD и /XF, причём за каждым следуют имена или маски через пробел.
Если нужно сохранить не только содержимое, но и сведения о файлах, обратите внимание на ключ /COPY. Без него копируются данные, атрибуты и время изменения. Дополнительные сведения, например права доступа и владельца, добавляют отдельными буквами этого ключа; перечень букв приведён в справке команды.
Ключи, которые встречаются чаще других
В таблице собраны ключи, значение которых описано в справке robocopy. Полный перечень выводит команда robocopy /?.
| Ключ | Что делает |
|---|---|
| /E | копирует подкаталоги, в том числе пустые |
| /S | копирует подкаталоги, кроме пустых |
| /Z | режим с возможностью продолжить копирование после обрыва |
| /R:n | число повторных попыток для файла, который не удалось скопировать |
| /W:n | пауза между попытками в секундах |
| /XD, /XF | исключить каталоги или файлы по имени или маске |
| /L | только показать, что было бы сделано, без копирования |
| /LOG:файл | записать вывод в файл вместо экрана |
Режим /Z имеет смысл при копировании по сети, где соединение может прерваться. Для локальных дисков он может замедлять работу, поэтому включайте его осознанно, а не по привычке.
Повторы и ожидание: почему команда «зависла» на одном файле
Типичная жалоба: robocopy замирает на одном файле, и окно долго ничего не печатает. Причина в значениях по умолчанию для повторных попыток. По справке, число повторов по умолчанию очень велико (около миллиона), а пауза между ними составляет 30 секунд. Если файл занят другой программой или недоступен, команда будет терпеливо ждать, а не пропустит его.
Поэтому в большинстве сценариев задают свои значения: /R:2 /W:5 означает две дополнительные попытки с паузой пять секунд. Конкретные цифры подбирайте под себя; они не имеют особого статуса, это просто разумный способ не ждать часами.
- Откройте журнал или вывод и найдите строку с именем файла, на котором остановилась команда.
- Проверьте, не держит ли файл другая программа: почтовый клиент, база данных, виртуальная машина.
- Закройте программу и перезапустите ту же команду: уже скопированные файлы будут пропущены.
- Если файл недоступен по правам, посмотрите страницу про icacls в этом же разделе.
Для многопоточного копирования существует ключ /MT:n. Он может ускорить перенос множества мелких файлов, но при медленном диске или сетевом ресурсе выигрыш бывает небольшим. Допустимый диапазон и значение по умолчанию смотрите в справке robocopy /?, а число потоков подбирайте опытным путём на своих данных.
Журнал и коды завершения
Для длинных копирований запишите вывод в файл: robocopy C:\Projects D:\Backup\Projects /E /R:2 /W:5 /LOG:D:\Backup\copy.log. Если хотите видеть процесс на экране и одновременно писать журнал, добавьте ключ /TEE. Ключ /LOG: перезаписывает файл, а /LOG+: дописывает в конец существующего.
Код завершения robocopy устроен иначе, чем у большинства программ: значения складываются как битовые флаги. Единица означает, что файлы были успешно скопированы, двойка говорит о лишних файлах в приёмнике, четвёрка о несовпадениях, а восьмёрка и больше о сбоях при копировании. Нулевой код означает, что копировать было нечего и расхождений не найдено. Значения от 0 до 7 принято считать отсутствием критических ошибок, а от 8 уже нужно смотреть журнал.
Проверить код сразу после запуска в командной строке можно через echo %errorlevel%, в PowerShell через $LASTEXITCODE. Не полагайтесь на то, что любой ненулевой код означает неудачу: единица как раз говорит об успешной работе.
Что стоит сделать перед первым серьёзным копированием
Перед переносом важных данных прогоните команду с ключом /L: она перечислит файлы, которые были бы скопированы, но ничего не запишет. Так видно, правильно ли указаны пути и маски. Затем уберите /L и запускайте реальное копирование.
После завершения сравните количество файлов и общий размер в итоговой таблице с исходными, а выборочно откройте несколько файлов в приёмнике. Резервная копия, которую ни разу не проверяли на открытие, остаётся предположением.
Если вы собираетесь запускать копирование по расписанию, связку robocopy и планировщика описывает отдельная страница про schtasks. А вопрос о том, какие данные вообще стоит копировать, разобран в материале про резервирование файлов.