Команды Robocopy: миграция данных, синхронизация папок и многое другое

Robocopy – одна из наиболее используемых утилит командной строки для копирования больших объемов данных в Windows. Она так популярна из-за своей мощности. Но с этой мощностью приходит сложность. В этом руководстве мы разберем всю эту сложность и предоставим полное руководство по использованию этого полезного инструмента.

Robocopy – это утилита командной строки Windows, доступная с Windows NT. Она является заменой менее гибкой утилите xcopy. Она позволяет указать путь к диску или серверу для копирования/перемещения файлов в командной строке.

Версия Robocopy на момент написания этого текста – 10.0.18. На этой версии я проводил тестирование.

Robocopy предоставляет множество функций, которые вы можете использовать для эффективного и быстрого копирования и перемещения файлов. Он может:

  • Копировать файлы по сети с возможностью возобновления
  • Может пропускать NTFS-точки соединения, вызывающие сбои, обычно из-за бесконечных циклов
  • Может копировать атрибуты файлов и каталогов, сохраняя временные метки
  • Может копировать разрешения NTFS, владельцев и информацию об аудитах
  • Может копировать временные метки каталогов
  • Может копировать файлы в режиме “резервное копирование”, чтобы убедиться, что файлы копируются, даже если права доступа были отказаны администратору
  • Автоматически повторять попытки
  • Может синхронизировать две папки
  • Умеет пропускать уже скопированные файлы
  • Может копировать пути, превышающие ограничение в 256 символов
  • Выполнять асинхронные копии с использованием возможностей многопоточности.
  • Возвращает стандартные коды выхода для использования в скриптах

Как видите, есть много для копирования. Я хотел рассказать вам все, что вам нужно знать об этом удобном инструменте.

Общий справочник по синтаксису Robocopy

Почему такой длинный блог-пост о единственной утилите? Просто посмотрите на таблицы ниже. У вас много вариантов копирования или перемещения файлов с помощью robocopy! Вы найдете больше вариантов в отдельных разделах.

Эти таблицы были созданы на основе справочного синтаксиса, возвращаемого robocopy /?. Они были разбиты на более значимые разделы, дополнены со временем и упорядочены для предоставления более полезной информации.

Параметры источника

Switch Explanation Default Behavior Equivalent Switch Notes
/S Copy subfolders
/E Copy subfolders including empty subfolders
/COPY:[DATSOU] Copy options /COPY:DAT D=Data, A=Attributes, T=Timestamps S=Security=NTFS ACLs, O=Owner info, U=aUditing info. File Data (D) always includes file Timestamps (T)
/SEC Copy files with SECurity /COPY:DATS
/DCOPY:T Copy directory timestamps
/COPYALL Copy ALL file info /COPY:DATSOU This will prevent dehydrating offline files and will instead copy the file’s tag (on emc VNX/Unity systems at least). This is not officially documented! If dehydration is what you need (reason i found this issue), you can’t copy the ACLs along your files. CREDIT: Monsieurx (Reddit)
/NOCOPY Copy NO file info useful with /PURGE
/A Copy only files with the Archive attribute set
/M like /A, but remove Archive attribute from source files
/LEV:n Only copy the top n LEVels of the source tree
/MAXAGE:n MAXimum file AGE – exclude files older than n days/date
/MINAGE:n MINimum file AGE – exclude files newer than n days/date If n < 1900 then n = no of days, else n = YYYYMMDD date
/FFT Assume FAT File Times 2-second date/time granularity. This replaces NTFS timestamps. Seems to be more reliable when transferring over a network.
/256 Turn off very long path (> 256 characters) support

Параметры назначения

Switch Explanation Default Behavior Equivalent Switch Notes
/A+:[RASHCNET] Set file attribute(s) on destination files + add
/A-:[RASHCNET] Remove file attribute(s) on destination files
/FAT Create destination files using 8.3 FAT file names only
/CREATE Create directory tree structure + zero-length files only
/DST Compensate for one-hour DST time differences

Параметры копирования

Switch Explanation Default Behavior Equivalent Switch Notes
/L List files only Don’t copy, timestamp or delete any files
/MOV Move files Delete from source after copying
/MOVE Move files and directories Delete from source after copying
/sl Copy file symbolic links instead of the target
/Z Copy files in restartable mode Survive a network glitch
/B Copy files in backup mode
/J Copy using unbuffered I/O Recommended for large files
/NOOFFLOAD Copy files without using the Windows copy offload mechanism https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/hh831628(v=ws.11)
/EFSRAW Copy any encrypted files using EFS RAW mode
/TIMFIX Fix file times on all files, even skipped files
/XO Exclude older if destination file exists and is the same date or newer than the source – don’t bother to overwrite it.
/XC Exclude changed files
/XN Exclude newer files
/XX Exclude files present in destination but not source /XX
/XF file [file]… Exclude files matching given names/paths/wildcards
/XD dirs [dirs]… Exclude directories matching given names/paths. /XF and /XD can be used in combination e.g. ROBOCOPY c:\source d:\dest /XF *.doc *.xls /XD c:\unwanted /S
/IA:[RASHCNETO] Include files with any of the given attributes
/XA:[RASHCNETO] Exclude files with any of the given attributes
/IM Overwrite modified files. This includes the same files with different times.
/IS Overwrite files even if they are already the same
/IT Include tweaked files
/XJ Exclude junction points from source /XJ
/XJD Exclude junction points from source directories
/XJF Exclude junction points from source files
/MAX:n Exclude files bigger than n bytes
/MIN:n Exclude files smaller than n bytes
/MAXLAD:n Exclude files unused since n
/MINLAD:n Exclude files used since n If n < 1900 then n = n days, else n = YYYYMMDD date
/MIR Mirror a directory tree /PURGE /E
/PURGE Delete dest files/folders that no longer exist in source
/XL Exclude files present in source but not destination
/SECFIX Robocopy /secfix fixes file security on all files, even skipped files. Specify the type of security information you want to copy by also using one of these options: /COPYALL /COPY:O /COPY:S /COPY:U /SEC
/ZB Use restartable mode; if access denied use Backup mode

Параметры мониторинга

Switch Explanation Default Behavior Equivalent Switch Notes
/R:n Number of retries on failed copies /R:1000000 Always try to set this option. I recommend setting this to 10-20 to not waste time retrying.
/W:n Wait time between retries /W:30 Always try to set this option to a lower number to retry more quickly. I suggest 5-10.
/REG Save /R:n and /W:n in the Windows registry as default settings
/RH:hhmm-hhmm times when new copies can be started
/TBD Wait for sharenames to be defined retry error 67
/PF Check run hours on a per file (not per pass) basis
/MON:n Run again when more than n changes seen
/MOT:m Run again in m minutes, if changed

Понимание поведения Robocopy

I’ve now completely blew your mind with all of the potential syntax options available to you. Let’s now see all of the different combinations of how we can use this syntax.

I could provide you an enormously long list of robocopy commands with an ever-growing number of switches. But I think it’s better to teach you how to fish. Let’s go over how to put sense out of all of these options.

Robocopy копирует только целые каталоги

Каждое выполнение robocopy будет иметь исходный и целевой каталоги. Robocopy копирует и перемещает файлы целыми каталогами. Невозможно явно скопировать отдельный файл с помощью robocopy. Для этого используйте команду copy или Copy-Item в PowerShell.

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

> robocopy c:\src d:\dst copythisfile.txt

Синтаксис зависит от окружения

Кроме того, параметры, которые вы указываете для robocopy, будут зависеть от окружения. Вам нужно будет ответить на несколько вопросов, пытаясь определить, какие параметры использовать.

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

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

Распознавание параметров по умолчанию

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

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

Ссылайтесь на параметры, которые вы видите в выводе, с объяснениями параметров выше, и вы точно поймете, что делает robocopy под капотом.

Default robocopy options

Понимание возможностей команд Robocopy

Если вы использовали команды copy или Copy-Item в PowerShell, вы, вероятно, указали исходный и целевой каталоги и продолжили свои дела. Там не так много параметров, которые можно настроить. У этих команд robocopy есть поведение по умолчанию.

Но robocopy, с другой стороны, понимает гораздо больше и дает вам гибкость настраивать поведение настолько, насколько вам нужно.

Важно знать, что robocopy осознает не только понятие файла или каталога. В файловой системе есть гораздо больше, и robocopy поддерживает практически все.

A file sitting on a filesystem isn’t just a dumb object with a single purpose. There are many different attributes and things that go with the concept of a file. For example, a file has attributes such as:

  • a timestamp (written, modified and accessed)
  • NTFS ACL
  • владелец
  • информацию об аудитории NTFS
  • флаг скрытости
  • флаг архивности

При копировании или перемещении файла у вас есть возможность взять все это вместе с ним, если хотите.

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

Основы: выполнение сценариев WhatIf

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

Используя параметр /L, вы можете указать robocopy перечислить все файлы и/или папки, которые вы указываете, и вернуть список файлов, которые он бы скопировал/переместил.

Вы можете использовать параметр /L с любым другим параметром. Это отличный способ вернуть все параметры, которые robocopy использовал бы (по умолчанию или нет). Это даст вам общую картину того, что robocopy будет делать с учетом указанных вами параметров.

Using /L

Основы: копирование файлов

Самым простым способом использования robocopy является указание исходного и целевого каталога без параметров.

> robocopy C:\src C:\dst

Этот параметр скопирует все файлы (кроме подкаталогов) из C:\src в C:\dst.

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

Ниже я копирую все ACL NTFS, владельцев файлов, подпапки (включая пустые) и все атрибуты файлов. Все это становится возможным с помощью опции /E для включения всех пустых подпапок и /COPYALL для копирования остального.

> robocopy C:\src C:\dst /E /COPYALL

Основы: перемещение файлов

Перемещение файлов перемещает файлы из одной папки в другую, как и копирование. Единственное отличие при операции перемещения заключается в том, что исходные файлы удаляются после копирования.

Чтобы удалить файлы/папки из источника после копирования, используйте опцию /MOV. Это удалит все файлы в указанной папке (без подпапок).

> robocopy C:\src C:\dst /MOV

Вы также можете использовать /MOVE, чтобы переместить все файлы и подпапки.

> robocopy C:\src C:\dst /MOVE

Основы: синхронизация файлов

Robocopy позволяет синхронизировать две папки. Это означает, что все файлы в папке назначения будут находиться в папке источнике и не более того. Опция /MIR скопирует данные, копируя все файлы из источника, отсутствующие в папке назначения, и удалит файлы в папке назначения, которых нет в источнике. Будьте осторожны!

> robocopy C:\src C:\dst /MIR

Копирование файлов через сеть

Если вы копируете файлы через сеть, есть несколько опций, которые следует рассмотреть.

Robocopy позволяет копировать файлы в “режиме возобновления” с помощью опции /Z. Это означает, что если копирование файла начинается и прерывается посередине, копирование может быть запущено заново, а не прервано полностью. Опция /Z полезна, когда поток обрывается в сети.

Предупреждение: Некоторые отмечают, что использование /Z ухудшает производительность на 1/4. Дайте мне знать ваши результаты.

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

robocopy C:\src \\SRV1\share /Z /FFT

Использование /IPG для управления интервалом между пакетами

При копировании файлов по сети вы можете использовать переключатель /IPG. Этот параметр также известен как опция интервала между пакетами. Он определяет (в миллисекундах) частоту, с которой Robocopy будет ожидать передачи новых пакетов.

Всегда используйте UNC-пути, а не буквы дисков

A reader on Reddit discovered the hard way to not use mapped drives as a destination directory. Instead, always use always use a UNC path. You might run into issues with the 256-character limit if you do. Check out this Microsoft doc for more information.

Режим резервного копирования Robocopy (Robocopy /Z)

У Robocopy есть опция (/B) или режим резервного копирования (/ZB), который копирует файлы в режиме резервного копирования. Что такое “режим резервного копирования” вообще?

Обычно, когда вы копируете файл в Windows и сталкиваетесь с файлом, который требует прав администратора для доступа, вы получите сообщение об ошибке, указывающее, что у вас нет разрешения. Несмотря на то, что вы можете работать от имени локального администратора, Windows не позволит вам получить доступ к нему.

ПРЕДУПРЕЖДЕНИЕ: Получены отчеты о поврежденных томах сервера при копировании данных на сервер Windows Server 2016 с включенной дедупликацией. При использовании параметра /ZB хранилище частей дедупликации будет повреждено в папке System Volume Information. Скопированные файлы будут неразборчивыми и вызывают ошибки при попытке их обработки. Ссылка на Serverfault с дополнительной информацией.

Режим резервного копирования – это способ доступа к файлам без необходимости беспокоиться о разрешениях.

Robocopy использует режим резервного копирования для получения привилегии SeBackupPrivilege для чтения файлов и привилегии SeRestorePrivilege для доступа к любым необходимым файлам. Это игнорирует любые ACE-записи, которые обычно могут предотвратить доступ к этим файлам.

Привилегии SeBackupPrivilege и SeRestorePrivilege обычно назначаются пользователям в группах Backup Operators и Administrators, но иногда они могут быть удалены. Режим резервного копирования устраняет этот риск и временно предоставляет права пользователю, выполняющему robocopy.

Если вы хотите проверить, имеет ли ваша учетная запись эти права, вы можете выполнить команду whoami /priv и оба права должны быть отображены.

Фильтрация файлов и папок

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

По имени файла или расширению файла

Фильтрация файлов, которые копируются/перемещаются при вызове robocopy, осуществляется с помощью подстановочных символов. Вы можете использовать подстановочный символ для фильтрации файлов, соответствующих определенной строке имени файла или расширению.

Например, чтобы копировать только файлы TXT, вы можете указать *.txt.

> robocopy C:\src C:\dst *.txt

Если вы хотите ограничиться только файлами, начинающимися с буквы a, вы можете использовать a*.

> robocopy C:\src C:\dst a*

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

> robocopy C:\src C:\dst a* b*

При фильтрации по имени файла robocopy покажет вам фильтр в выводе.

FIltering files output

По имени каталога

Robocopy позволяет фильтровать элементы не только по файлу, но и по имени каталога. С помощью robocopy /xd вы можете исключить определенные каталоги, соответствующие определенному имени.

При копировании нескольких папок используйте переключатель /XD, чтобы исключить папки из выполнения.

> robocopy C:\src C:\dst /XD "c:\src\exclude"

По метке времени файла/каталога

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

Switch Explanation
/DCOPY:T Copy directory timestamps
/MAXAGE:n Exclude files older than n days/date
/MINAGE:n Exclude files newer than n days/date
/XO If destination file exists and is the same date or newer than the source, don’t overwrite
/XN If destination file exists and is the same date or older than the source, don’t overwrite

Существует два популярных варианта выбора при фильтрации по метке времени: /XO и /MAXAGE.

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

> robocopy C:\src C:\dsc /XO

Если вы знаете максимальный возраст файлов, вы также можете использовать опцию /MAXAGE. Это позволяет указать в формате ГГГГММДД дату, на которую файл должен быть старше, чтобы его скопировали.

> robocopy c:\src c:\dst /S /MAXAGE:20191001

Задачи Robocopy

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

Файлы задач Robocopy являются текстовыми файлами, содержащими одну опцию на строку. Обычно вы будете использовать robocopy для создания этих файлов задач. После создания вы можете использовать robocopy для их изменения или простого текстового редактора.

У вас есть различные команды robocopy, работающие с задачами.

Switch Explanation Default Behavior Equivalent Switch Notes
/JOB:jobname Take parameters from the named job file
/SAVE:jobname Save parameters to the named job file
/QUIT Quit after processing command line Useful for viewing parameters
/NOSD No source directory is specified
/NODD No destination directory is specified
/IF Include the following files

A typical job file created with robocopy has an RCJ extension and looks like the below snippet. This job file was created by running robocopy C:\src D:\dst /save:myjob. You can see that you can provide comments in the job file using :: which is most of what this file has.

Без комментариев файл содержал бы только одну опцию на строку.

::
:: Robocopy Job C:\MYJOB.RCJ
::
:: Created by Administrator on Sunday, August 18, XXXX at 8:53:24 AM
::

::
:: Source Directory :
::
        /SD:C:\SRC\     :: Source Directory.

::
:: Destination Directory :
::
        /DD:C:\SRC\     :: Destination Directory.

::
:: Include These Files :
::
        /IF             :: Include Files matching these names
::              *.*     :: Include all names (currently - Command Line may override)

::
:: Exclude These Directories :
::
        /XD             :: eXclude Directories matching these names
::                      :: eXclude no names (currently - Command Line may override)

::
:: Exclude These Files :
::
        /XF             :: eXclude Files matching these names
::                      :: eXclude no names (currently - Command Line may override)
::
:: Copy options :
::
        /DCOPY:DA       :: what to COPY for directories (default is /DCOPY:DA).
        /COPY:DAT       :: what to COPY for files (default is /COPY:DAT).
::
:: Retry Options :
::
        /R:1000000      :: number of Retries on failed copies: default 1 million.
        /W:30           :: Wait time between retries: default is 30 seconds.
::
:: Logging Options :
::

Сохранение файлов задач

Сохранение файла задачи так же просто, как добавление опции /SAVE:<имя_задачи> в конец вашего синтаксиса. Замените <имя_задачи> на имя задачи. Опция /SAVE создаст файл с именем <имя_задачи>.rcj в папке, где вы запустили robocopy.

> robocopy C:\src C:\dst /SAVE:myjob

Вы должны указать /SAVE в качестве последней опции. Любые опции, указанные после /SAVE, не будут добавлены в файл задачи. Также обратите внимание, что даже если уже существует файл задачи, robocopy всегда перезапишет существующий файл. Создавайте резервные копии или контролируйте версии ваших файлов задач!

Примечание: Если вы попытаетесь использовать опцию /MT при сохранении в файл задачи, она не будет включена в файл задачи. Дайте мне знать, удалось ли вам включить ее.

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

После сохранения задания в файл задания вы можете использовать параметр /JOB:<имя_задания> для указания файла задания для чтения. Robocopy считывает все параметры из файла задания. Затем он выполняется так, как если бы вы указали параметры непосредственно в командной строке.

> robocopy /JOB:myjob

Создание файла задания без запуска задания с использованием параметра /QUIT

Назначение параметра /QUIT не очевидно. На первый взгляд, вы можете подумать, что /QUIT принуждает работу к завершению. Вместо этого /QUIT действует больше как опция, предотвращающая запуск задания в первую очередь.

Официально, параметр /QUIT “принуждает robocopy прекратить обработку командной строки”. Однако лучше объяснить его как создание файла задания без запуска задания.

Если вы используете параметр /SAVE, он также автоматически запустит задание. Нет способа создать файл задания без предварительного запуска задания. Вы можете создать файл задания RCJ с помощью текстового редактора или использовать robocopy, добавив /QUIT в конце.

> robocopy C:\src C:\dst /SAVE:myjob /QUIT

Редактирование файла задания

Так как файлы заданий – это просто текстовые файлы, вы можете редактировать их с помощью вашего любимого текстового редактора или вы можете попросить robocopy сделать это за вас.

Вы можете редактировать файлы заданий, используя комбинацию параметров /JOB, /SAVE и /QUIT.

Например, возможно, вам хотелось бы исключить все файлы EXE из вашего задания robocopy, сохраненного в файле задания под названием backupfiles.rcj. Вы уже создали файл задания и не хотите перезаписывать его полностью. Вы можете добавить новый параметр, как показано ниже:

> robocopy /JOB:backupfiles /XF *.EXE /SAVE:backupfiles /QUIT

Использование нескольких файлов заданий

Вы можете даже комбинировать использование файлов заданий. При указании нескольких файлов заданий в одном запуске все опции, используемые в этом запуске, будут объединены вместе.

Например, предположим, у вас есть большой список файлов, которые нужно исключить из вашего копирования backupfiles. Откройте текстовый редактор и добавьте следующее, чтобы создать файл exclude.rcj.

/XF
    a.exe
    b.txt
    c.cer

Затем вы можете исключить эти файлы из задания backupfiles следующим образом:

> robocopy /JOB:backupfiles /JOB:exclude

Поскольку исходный файл задания backupfiles уже исключал все файлы EXE, синтаксис выше будет выглядеть так: /XF *.exe a.exe b.txt c.cer. Robocopy объединяет все опции в одну.

Шаблоны Robocopy и использование опций /NOSD и /NODD

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

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

Для простого примера создайте файл задания без указания исходного или конечного каталога, используя следующий синтаксис. Цель этого задания – скопировать все файлы TXT и EXE из исходного каталога в конечный каталог.

> robocopy *.txt *.exe /SAVE:backupfiles /QUIT

Сам по себе это задание никогда не будет работать, потому что не указаны исходный или конечный каталог.

При создании задания без исходного и целевого каталога файл задания автоматически создается с использованием параметров /NOSD и /NODD.

/NOSD           
/NODD
/IF
    *.txt
    *.exe
/DCOPY:DA
/COPY:DAT
/R:1000000
/W:30

Параметр /NOSD указывает robocopy на отсутствие исходного каталога, а /NODD указывает на отсутствие целевого каталога. Этот файл задания является “шаблоном” для других заданий.

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

Чтобы использовать только что созданный файл задания для копирования файлов из C:\src в C:\dst, вы можете передать эти каталоги непосредственно в командной строке, которая затем будет передана в задание.

> robocopy /JOB:backupfiles C:\src C:\dst

Асинхронное копирование (Robocopy /MT)

По умолчанию robocopy обрабатывает только один файл за один раз. Однако, вы можете заставить robocopy копировать больше файлов одновременно, используя опцию /MT.

Опция /MT позволяет указать количество потоков, которые будет использовать robocopy для копирования файлов. Максимальное значение – 128.

Вы можете использовать /MT следующим образом:

> robocopy C:\src C:\dst /MT:32

I’ve chosen 32 in this case as a baseline. I suggest starting at 32 to see how your computer and network handle things and adjust the threads accordingly.

Обратите внимание, что если вы используете /MT, вы не сможете использовать /IPG или /EFSRAW. Для более эффективной работы не выводите журнал на консоль. Вместо этого используйте /LOG.

Планирование выполнения Robocopy

У robocopy есть несколько способов планирования выполнения.

С помощью параметра /RH

С помощью опции /RH вы можете указать robocopy запускаться только в определенное время. Это отлично, если у вас есть окно обслуживания или время, когда все ушли домой.

Вы можете указать время начала и времени окончания в формате ЧЧММ-ЧЧММ. Например, чтобы вызвать robocopy, но разрешить его работать только с 17:00 до 9:00, задайте команду:

> robocopy C:\src C:\dst /RH:1700-0900

Вы увидите, что если вызвать robocopy вне указанных часов, он покажет текущее время и будет ждать начала работы.

Robocopy tells you what time it will start if scheduled

Убедитесь, что оба времени указаны в 24-часовом формате и состоят ровно из четырех цифр. Окно должно быть длиннее двух минут.

По умолчанию, используя /RH, производится проверка времени начала перед всем запуском. Однако, если у вас много файлов и вы считаете, что процесс может занять больше времени, вы можете использовать опцию /PF. /PF заставит robocopy проверять окно перед каждым файлом.

Использование планировщика задач

Выходной журнал

Robocopy всегда возвращает выходной журнал. Выводится ли этот журнал через stdout в консоли и/или перенаправляется в файл журнала – решаете вы.

У вас есть множество вариантов для отображения вывода robocopy.

Switch Explanation Default Behavior Equivalent Switch Notes
/NP No progress. Suppresses the display of progress information. This can be useful when output is redirected to a file.
/unicode Display the status output as unicode text
/LOG:file Output status to log file and overwrite
/UNILOG:file Output status to unicode log file and overwrite
/LOG+:file Output status to log file and append to existing log file
/UNILOG+:file Output status to unicode log file and append to existing log file
/TS Displays the file timestamps for every file processed.
/FP Replaces simple file names with full file pathnames in the output.
/NS Does not show file sizes.
/NC Hides output the file class “Text Tags” (Go here for more information: https://www.uvm.edu/~gcd/2015/04/robocopy-file-classes/)
/NFL Hides file names. Failures are still logged though. Any files files deleted or would be deleted if /L was omitted are always logged
/NDL Hides output of the directory listing. Full file pathnames are output to more easily track down problematic files.
/TEE Output to console window, as well as the log file
/NJH No job header
/NJS No job summary
/BYTES Print sizes as bytes
/X Report all files, not just those selected & copied
/V Produce verbose output log, showing skipped files
/ETA Show estimated time of arrival of copied files. See the start time of each file copy and the estimated time of completion based on the observed throughput of previous copies. Times are displayed after the file name in the format HH:MM – > HH:MM (start – > finish).
/DEBUG Show debug volume information

Ограничение элементов журнала с помощью /NJS и /NJH

По умолчанию robocopy возвращает два элемента в своем выводе: заголовок задания и сводка задания.

Заголовок задания – это простой заголовок ROBOCOPY вверху.

Robocopy job header

Сводка задания показывает состояние всех файлов/папок, объем переданных данных и время завершения выполнения.

Robocopy job summary

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

Hiding the job header and job summary

Перенаправление вывода в файл

Если вам нужно сохранить журнал вывода, вы можете перенаправить его в текстовый файл и/или отобразить его в консоли. Вы можете сделать это с помощью традиционных перенаправителей вывода, таких как >, >>, PowerShell или параметр /LOG.

Чтобы перенаправить журнал вывода в файл, используя параметр /LOG и перезаписать существующий файл журнала, используйте синтаксис /LOG:<путь_к_файлу> следующим образом. Единственный вывод, который вы получите в консоли, – это путь к файлу журнала.

> robocopy C:\src C:\dst /LOG:c:\file.log

 Log File : c:\file.log

Если вы хотите сохранить содержимое существующего файла журнала и добавить результаты в файл, вы можете использовать оператор +, как показано ниже.

> robocopy C:\src C:\dst /LOG+:c:\file.log

 Log File : c:\file.log

Перенаправление вывода журнала в файл и отображение на консоли

Если вы хотите сохранить журнал вывода в файле и видеть его в консоли, вы можете использовать параметр /TEE. Этот параметр заставляет robocopy записывать вывод в файл журнала, при этом сохраняя стандартное поведение вывода на консоль.

robocopy C:\src C:\dst /LOG+:c:\file.log /TEE

Коды завершения

Как и все другие утилиты командной строки, robocopy возвращает коды завершения в зависимости от результатов выполнения. Мы все надеемся, что robocopy всегда завершается успешно с кодом 0, но это не всегда происходит.

Ниже приведены все коды завершения, которые возвращает robocopy, а также их объяснение. Любой код завершения, превышающий семь, указывает, что произошла хотя бы одна ошибка во время выполнения.

Exit Code Explanation
0 No action performed. Source and destination are synchronized.
1 At least one file was copied successfully.
2 Extra files or directories were detected. Examine log.
3 Exit codes 2 and 1 combined.
4 Mismatched files or directories found. Examine log.
5 Exit codes 4 and 1 combined.
6 Exit codes 4 and 2 combined.
7 Exit codes 4, 1 and 2 combined.
8 At least one file or directory could not be copied. Retry limit exceeeded. Examine log.
16 Copy failed catastrophically.

Обратите внимание, что если вы выполняете robocopy в сторонней утилите, эта утилита может считать любой ненулевой код завершения ошибкой. Чтобы предотвратить это, вы можете изменить код завершения на 0, если он возвращает 1.

Код завершения “extra” файла в robocopy обычно означает, что в папке назначения есть “extra” файл, которого нет в папке источнике. Этот код исключает “extra” файлы, которые могут помешать удалению из папки назначения.

Изменение кода завершения в пакетном файле

Если вы выполняете robocopy с помощью пакетного файла, вы можете получить значение переменной %ERRORLEVEL%. Если она возвращает 1, используйте ключевое слово exit, чтобы выйти из сценария с кодом 0.

> (robocopy <options>) ^& IF %ERRORLEVEL% LEQ 1 exit 0

Изменение кода завершения в сценарии PowerShell

Если вы выполняете robocopy в сценарии PowerShell, вы можете вызвать robocopy с помощью команды Start-Process с использованием параметра PassThru, чтобы вернуть созданный процесс, а также параметра Wait, чтобы дождаться завершения robocopy. Затем вы можете проверить свойство ExitCode на значение 1. Если код завершения равен 1, завершите сценарий PowerShell с кодом 0, используя $host.SetShouldExit().

$exitCode = (Start-Process -FilePath 'robocopy' -ArgumentList '<option>' -PassThru -Wait).ExitCode
if ($exitCode -eq 1) {
    $host.SetShouldExit(0)
}

Общие ошибки

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

Ошибка Недопустимый параметр

Когда вы видите ошибку, указывающую на ошибка недопустимого параметра, это обычно означает, что вы somehow пытались передать параметры robocopy в неправильной последовательности. Ошибки недопустимого параметра robocopy 3 являются наиболее распространенными.

A common reason you’d receive this error is when you specify a source or destination directory with spaces and forget to surround it with quotes.

Примеры robocopy

Вы можете создавать свои строки robocopy или использовать то, что другие уже узнали! В этом разделе я расскажу о том, как использовать robocopy для выполнения различных задач.

Найти размер каталога сетевой папки

Участник: northendtroooper (Reddit)

> robocopy "\\MACHINE\fileshare" c:\dummy /l /xj /e /nfl /ndl /njh /r:0 /mt:64

Быстро удалить содержимое папки (игнорируя разрешения в подпапках)

Участник: pizzasteveo (Reddit)

> robocopy c:\dummy c:\foldertodelete /MIR

Выполнение миграции больших файлов

Участник: @MySnozzberries (Twitter)

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

Наконец, мы выполняем полное копирование robocopy с DACL в пункт назначения с журналом. Журнал затем можно просмотреть для выявления дополнительных проблем с разрешениями или просто блокировок файлов, и позже можно выполнить еще одну дельта-синхронизацию.

> takeown /F .\test /R /A /D Y
> icacls .\test /grant "Administrators":(OI)(CI)F /T
> robocopy .\test .\test2 /E /SEC /FP /V /LOG:.\temp.log

Рекурсивно вынуждаем группу Администраторы стать владельцем всех файлов и каталогов. Есть способы обойти это, но это самый категоричный подход и обычно самый быстрый.

> takeown /F .\test /R /A /D Y

После того, как мы стали владельцем, мы можем принудительно добавить новый ACE в DACL для каждого объекта. Это дает группе Администраторы полный контроль с включенным наследованием и рекурсивно через путь.

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

> icacls .\test /grant "Administrators":(OI)(CI)F /T

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

Затем мы записываем операцию с полными путями и для всех объектов (переключатель /V в режиме подробного вывода) в журнал, чтобы мы могли устранить <5% ошибок, которые обычно связаны с длиной пути или блокировкой файла, и получить более детальную информацию.

> robocopy .\test .\test2 /E /SEC /FP /V /LOG:.\temp.log

Это простая структура для управления миграцией общего доступа к файлам с минимальным воздействием на пользовательский опыт. Она также улучшает контроль IT над данными. Если у клиента есть строгая практика управления данными, где владение должно быть правильно управляемо на уровне дочерних папок, то это становится более сложным вопросом, но большинство клиентов, как мы обнаружили, ограничиваются только наследованием и ACE на основе групп, поэтому это наиболее распространенная ситуация и способ ее исправления, с которого мы начинаем.

Альтернативы Robocopy

Robocopy – замечательный инструмент, но существует множество других подобных ему инструментов, которые могут быть вам интересны.

  • xxcopy – похожая утилита командной строки с огромным количеством опций.
  • Командлет Copy-Item в PowerShell – не такой функциональный, но намного проще.
  • TreeSize – графическая и скриптовая утилита для поиска информации о папках.

Резюме

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

Source:
https://adamtheautomator.com/robocopy/