Копирование файлов без перезаписи

Обновлено: 04.07.2024

В разделе Примеры показан принцип использования этой команды.

Синтаксис

Параметры

Комментарии

Использование /z

Если вы потеряли подключение на этапе копирования (например, если сервер переходит в режим «вне сети»), то после повторного подключения Подключение возобновится. /z также отображает процент выполнения операции копирования для каждого файла.

Использование /y в переменной среды копикмд.

В переменной среды КОПИКМД можно использовать параметр /y . Эту команду можно переопределить с помощью /-и в командной строке. По умолчанию выводится запрос на перезапись.

Копирование зашифрованных файлов

Копирование зашифрованных файлов на том, который не поддерживает EFS, приводит к ошибке. Сначала расшифровать файлы или скопировать их на том, который поддерживает EFS.

Чтобы добавить файлы, укажите один файл для назначения, но несколько файлов для источника (то есть с помощью подстановочных знаков или формата file1 + file2 + файл3).

Значение по умолчанию для назначения

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

Указание того, является ли назначение файлом или каталогом

Нажмите клавишу F, если хотите скопировать файл или файлы в файл. Нажмите клавишу D, если хотите скопировать файл или файлы в каталог.

Использование команды xcopy для установки атрибута архива для целевых файлов

Команда xcopy создает файлы с установленным атрибутом Archive, независимо от того, был ли этот атрибут задан в исходном файле. Дополнительные сведения об атрибутах файлов и attribсм. в разделе Дополнительные ссылки.

Сравнение xcopy и diskcopy

Если у вас есть диск, содержащий файлы в подкаталогах, и вы хотите скопировать его на диск, имеющий другой формат, используйте команду xcopy вместо команды diskcopy. Так как команда diskcopy копирует диски по дорожке, исходный и целевой диски должны иметь одинаковый формат. Команда xcopy не имеет этого требования. Используйте xcopy , если вам не нужна полная копия образа диска.

Коды выхода для команды xcopy

Для обработки кодов завершения, возвращаемых xcopy, используйте параметр ERRORLEVEL в командной строке If в пакетной программе. Пример пакетной программы, обрабатывающей коды завершения с помощью If, см. в разделе Дополнительные ссылки. В следующей таблице перечислены все коды выхода и их описание.

Примеры

1. чтобы скопировать все файлы и подкаталоги (включая все пустые подкаталоги) с диска A на диск B, введите:

2. чтобы включить в предыдущий пример все системные или скрытые файлы, добавьте параметр командной строки/h следующим образом:

3. чтобы обновить файлы в каталоге \репортс с файлами в каталоге \равдата, которые были изменены с 29 декабря 1993 г., введите:

4. чтобы обновить все файлы, существующие в \репортс в предыдущем примере, независимо от даты, введите:

5. чтобы получить список файлов для копирования с помощью предыдущей команды (т. е. без фактического копирования файлов), введите:

Файл xcopy. out содержит список всех копируемых файлов.

6. чтобы скопировать каталог \кустомер и все подкаталоги в каталог \\публик\аддресс на сетевом диске H:, оставьте атрибут "только для чтения" и при создании нового файла в H: введите:

8. можно создать пакетную программу для выполнения операций xcopy и использовать пакет If для обработки кода выхода при возникновении ошибки. Например, в следующей пакетной программе для параметров источника и назначения xcopy используются заменяемые параметры:

Чтобы использовать предыдущую пакетную программу для копирования всех файлов в каталоге К:\пргмкоде и его подкаталогов на диск B, введите:

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

В предыдущем примере это конкретное значение исходного параметра .\ток *. yml копирует те же три файла, даже если их два символа пути . \ были удалены. Однако файлы не копируются, если из исходного параметра был удален подстановочный знак «звездочка», что делает его просто .\ток.ИМЛ.

Я просто не могу найти способ в командной строке сказать: "скопируйте все файлы из каталога A в каталог B, но если файл уже существует в каталоге B, не перезаписывайте его, независимо от того, какой файл новее, и не запрашивайте меня."

Я прошел через copy, move, xcopy & robocopy, и самое близкое, что я могу получить, это то, что вы можете сказать robocopy "копировать A В B, но не перезаписывать новые файлы старыми файлами", но это не работает для меня. Я посмотрел на xxcopy, но отбросил это, поскольку я не хочу иметь стороннюю зависимость от события Visual Studio после сборки, которое потребует от других пользователей SVN установки этого инструмента для выполнения сборки.

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

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

Я использую частичные классы для тех элементов, для которых я могу, но есть другие вещи, которые я генерирую, которые не могут использовать частичные классы (например, создание EditorTemplate по умолчанию или DisplayTemplate *.файл ascx).

У кого-нибудь есть подобные проблемы, которые они решили?

Robocopy, или "надежная копия файла", является командой репликации каталога командной строки. Он был доступен как часть набора ресурсов Windows, начиная с Windows NT 4.0, и был представлен как стандартная функция Windows Vista, Windows 7 и Windows Server 2008.

подробнее (используя ответы Hydrargyrum, HailGallaxar и Andy Schmidt):

  • /E делает Robocopy рекурсивно поддиректории копия , включая пустые.
  • /XC исключает существующие файлы с времени, но разные размер файла. Программы обычно перезаписывает.
  • /XN исключает существующие файлы новыми чем копия в пункте назначения справочник. В Robocopy нормально переписывает их.
  • /XO исключает существующие файлы старше чем копия в пункте назначения справочник. В Robocopy нормально переписывает их.

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

решение Велисария хорошее.

чтобы уточнить этот немного краткий ответ:

  • /E делает Robocopy рекурсивно копировать подкаталоги, включая пустые.
  • /XC исключает существующие файлы с времени, но разные размер файла. Программы обычно перезаписывает.
  • /XN исключает существующие файлы новыми чем копия в источнике справочник. В Robocopy нормально переписывает их.
  • /XO исключает существующие файлы старше чем копия в источнике справочник. В Robocopy нормально переписывает их.

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

Вы можете попробовать это:

-y просто запрашивает перед перезаписью, и мы можем передать n НА ВСЕ эти вопросы. Таким образом, это, по сути, просто копирует несуществующие файлы. :)

Я просто не могу найти способ в командной строке сказать «скопируйте все файлы из каталога A в каталог B, но если файл уже существует в каталоге B, не перезаписывайте его, независимо от того, какой файл новее. , и не предлагать мне ".

Я прошел через копирование, перемещение, xcopy и robocopy, и самое близкое, что я могу получить, это то, что вы можете сказать robocopy «копировать A в B, но не перезаписывать новые файлы более старыми файлами», но это не работает для меня . Я посмотрел на xxcopy, но отказался от него, так как я не хочу иметь стороннюю зависимость от события пост-сборки Visual Studio, которое потребует от других пользователей SVN установки этого инструмента для выполнения сборки.

Я хочу добавить командную строку к событию после сборки в Visual Studio 2010, чтобы файлы, созданные из Шаблоны T4 для новых объектов модели EF распространяются в папки проекта, чтобы которым они принадлежат, но регенерированные файлы для существующих объектов не перезаписывают потенциально отредактированные файлы назначения.

Поскольку шаблон T4 регенерируется, исходный файл всегда новее, и я не могу надежно использовать переключатель «более новый», я не думаю.

Я использую частичные классы для тех элементов, для которых могу, но есть и другие вещи, которые я генерирую, которые не могут использовать частичные классы (например, создание файла EditorTemplate по умолчанию или DisplayTemplate * .ascx).

У кого-нибудь есть подобные проблемы, которые они решили?

Robocopy , или «Надежное копирование файлов» - это команда репликации каталога из командной строки. Он был доступен как часть Windows Resource Kit, начиная с Windows NT 4.0, и был представлен как стандартная функция Windows Vista, Windows 7 и Windows Server 2008.

  • /E заставляет Robocopy рекурсивно копировать подкаталоги, в том числе и пустые.
  • /XC исключает существующие файлы с такая же отметка времени, но другая размеры файлов. Robocopy обычно их перезаписывает.
  • /XN исключает существующие файлы новее чем копия в месте назначения каталог. Робокопия обычно перезаписывает те.
  • /XO исключает существующие файлы старше чем копия в месте назначения каталог. Робокопия обычно перезаписывает те.

За исключением классов Changed, Older и Newer, Robocopy делает именно то, что хочет исходный плакат - без необходимости загружать среду сценариев.

Ссылки: Technet, Википедия
Загрузите с: Ссылка для загрузки Microsoft (Ссылка последняя проверка 30 марта 2016 г.)

Решение Велисария хорошее.

Чтобы уточнить этот немного краткий ответ:

  • /E заставляет Robocopy рекурсивно копировать подкаталоги, в том числе и пустые.
  • /XC исключает существующие файлы с такая же отметка времени, но другая размеры файлов. Robocopy обычно их перезаписывает.
  • /XN исключает существующие файлы новее чем копия в источнике каталог. Робокопия обычно перезаписывает те.
  • /XO исключает существующие файлы старше чем копия в источнике каталог. Робокопия обычно перезаписывает те.

За исключением классов Changed, Older и Newer, Robocopy делает именно то, что хочет исходный плакат - без необходимости загружать среду сценариев.

Вы можете попробовать это:

-y просто запрашивает перед перезаписью, и мы можем передать n на все эти вопросы. Таким образом, это, по сути, просто копирует несуществующие файлы. :)

Вот он в виде пакетного файла:

Есть странный способ сделать это с помощью xcopy:

Просто включите столько n, сколько копируемых файлов, и он ответит n на все вопросы о перезаписи.

Я просто хочу кое-что прояснить из своего собственного тестирования.

  • / XN исключает существующие файлы новее, чем копия в исходном каталоге. Robocopy обычно их перезаписывает.
  • / XO исключает существующие файлы старше копии в исходном каталоге. Robocopy обычно их перезаписывает.

На самом деле это наоборот. XN выполняет «исключение более новых» файлов, но исключает файлы, которые новее, чем копия в каталоге назначения . XO выполняет «eXclude Older», но исключает файлы, которые старше копии в каталоге назначения .

Конечно, как всегда, проводите собственное тестирование.

/ XX: исключить "дополнительные" файлы и каталоги (присутствующие в месте назначения, но не в источнике). Это предотвратит любые удаления из места назначения. (это по умолчанию)

Robocopy можно скачать здесь для систем, где он еще не установлен. (То есть Windows Server 2003.)

Не забудьте указать путь к файлу robocopy exe. Для этого щелкните правой кнопкой мыши «мой компьютер»> «Свойства»> «Дополнительно»> «Переменные среды», затем найдите системную переменную пути и добавьте ее в конец: «; C: \ Program Files \ Windows Resource Kits \ Tools» или где угодно установил его. Обязательно оставьте строки переменных пути, которые уже есть, и просто добавьте дополнительный путь.

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

Параметр «Исключить старые / новые файлы» согласуется с информацией, отображаемой в журнале RoboCopy: RoboCopy выполнит итерацию по ИСТОЧНИКУ, а затем сообщит, является ли каждый файл в ИСТОЧНИКЕ «СТАРШЕ» или «НОВОЕ», чем файл в месте назначения.

Следовательно, / XO будет исключать файлы СТАРЫЙ ИСТОЧНИК (что интуитивно понятно), а не «старше исходного», как было заявлено здесь.

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

Это то, что у меня сработало. Я использую это для «добавления» файлов на другой диск без перезаписи.

Пакетный файл: robocopy-missingfiles.bat

Пример:

Сделайте тест перед внедрением.

Простым подходом было бы использование параметра / MIR для зеркалирования двух каталогов. Обычно он копирует в место назначения только новые файлы. В следующей команде замените источник и место назначения на пути к вашим папкам, скрипт будет искать любой файл с любыми расширениями.


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

Я использую частичные классы для тех элементов, для которых могу, но есть и другие вещи, которые я генерирую, которые не могут использовать частичные классы (например, создание файла EditorTemplate по умолчанию или DisplayTemplate * .ascx).

У кого-нибудь есть подобные проблемы, которые они решили?

  • Вы знакомы с cmd.exe с for команда? Если нет, я рекомендую вам запустить for /? и используйте это.
  • /E заставляет Robocopy рекурсивно копировать подкаталоги, в том числе пустые.
  • /XC исключает существующие файлы с той же меткой времени, но с разными размерами файлов. Robocopy обычно их перезаписывает.
  • /XN исключает существующие файлы новее, чем копия в целевом каталоге. Robocopy обычно их перезаписывает.
  • /XO исключает существующие файлы старше копии в целевом каталоге. Robocopy обычно их перезаписывает.

За исключением классов Changed, Older и Newer, Robocopy делает именно то, что хочет исходный плакат - без необходимости загружать среду сценариев.

Решение Велисария хорошее.

Чтобы уточнить этот немного краткий ответ:

  • /E заставляет Robocopy рекурсивно копировать подкаталоги, в том числе пустые.
  • /XC исключает существующие файлы с той же меткой времени, но с разными размерами файлов. Robocopy обычно их перезаписывает.
  • /XN исключает существующие файлы новее, чем копия в исходном каталоге. Robocopy обычно их перезаписывает.
  • /XO исключает существующие файлы старше копии в исходном каталоге. Robocopy обычно их перезаписывает.

За исключением классов Changed, Older и Newer, Robocopy делает именно то, что хочет исходный плакат - без необходимости загружать среду сценариев.

Вы можете попробовать это:

-y просто запрашивает перед перезаписью, и мы можем передать n на все эти вопросы. По сути, это просто копирует несуществующие файлы. :)

  • 2 Красиво просто.
  • 6 почему он отвечает на все вопросы, когда мы трубим только один раз?
  • Потрясающе, я пошел с этим вариантом. Прежде чем думать о конвейере, я поискал в Google параметр, который, как мне казалось, мне не хватает, а затем наткнулся на эту страницу. Пробуя это решение, я заметил, что при подключении по конвейеру копирование, по-видимому, включает параметр / Y, поэтому необходимо добавить / -Y.
  • 2 @phuclv Кажется copy /-y просто автоматически предполагает, что нет, как только stdin исчерпывает ввод. Вы можете опустить первый явный n , или труба в него, и происходит то же самое.

Вот он в виде пакетного файла:

Я просто хочу кое-что прояснить из своего собственного тестирования.

  • / XN исключает существующие файлы новее, чем копия в исходном каталоге. Robocopy обычно их перезаписывает.
  • / XO исключает существующие файлы старше копии в исходном каталоге. Robocopy обычно их перезаписывает.

Конечно, как всегда, проводите собственное тестирование.

  • 1 Это ответ на исходный вопрос или комментарий к чьему-то ответу?
  • 1 Является ли ответ Гидраргрума, набравший +25 голосов на момент написания, ответом на исходный вопрос или комментарием к чьему-либо ответу?

Есть странный способ сделать это с помощью xcopy:

Просто включите столько n, сколько копируемых файлов, и он ответит n на все вопросы о перезаписи.

  • Что касается copy см. этот ответ, в частности комментарий @mwfearnley: copy /-y автоматически предполагает n как только stdin будет исчерпан, поэтому вы можете, например, echo n только один раз, и он все еще работает.

/ XX: исключить "дополнительные" файлы и каталоги (присутствующие в месте назначения, но не в источнике). Это предотвратит удаление из места назначения. (это по умолчанию)

Robocopy можно скачать здесь для систем, где он еще не установлен. (То есть Windows Server 2003.)

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

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

Простым подходом было бы использование параметра / MIR для зеркалирования двух каталогов. Обычно он копирует в место назначения только новые файлы. В следующей команде замените источник и место назначения на пути к вашим папкам, скрипт будет искать любой файл с любыми расширениями.

date

25.11.2020

directory

Windows 10, Утилиты

comments

комментариев 8

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 (c GUI) от Microsoft нет. Существуют пользовательские версии, но их поддержка прекращена. Список неофициальных GUI для robocopy (это сторонние программы):

Синтаксис и параметры robocopy

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

robocopy <source> <dest> [фильтр файлов] [параметры]

Поддерживаются как локальные пути, так и UNC, например, \\server\directory

Полный синтаксис утилиты robocopy (все параметры и их описания) доступны по команде:

использование утилиты robocopy в windows для копирование и синхронизации файлов и каталогов

Исполняемы файл robocopy.exe находится в каталоге C:\Windows\System32.

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

Для тестирование различных команд robocopy без выполнения операций (копирования, перемещения или удаления) с файлами используется параметр /L . Данный параметр вернет список файлов и папок, которые будут скопированы вашей командой.

Использование 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

Обратите внимание на ключ /Z даже если вы копируете небольшие файлы по устойчивому каналу. Он не несёт дополнительных расходов при использовании, но в случае обрыва, вы сможете продолжить копирование просто повторно запустив скрипт.

При копировании больших файлов (более 2 Гб) с некоторых iSCSI/SAN томов, процесс robocopy может существенно использовать оперативную память сервера. Проблем обычно связано с тем, что для данного LUN в настройках RAID используется write-through кэширование вместо write-back.

Инкрементальное копирование с помощью robocopy

Сам по себе robocopy не может полностью обеспечить инкрементальное резервное копирование каталога (копирование новых и измененных файлов), для этого мы будем использовать небольшой bat скрипт:

Заметка. Если файловые системы source или dest не являются NTFS, используйте ключ /FFT , так как на других файловых системах (включая эмулированные NTFS) может возникнуть ошибка, из-за которой robocopy будет видеть старые файлы как измененные, из-за отличий в метке времени.

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
Примечание. Поведение robocopy при использовании ключей /MOVE и /MOV не интуитивно.
  • Если вы используете ключ /MOVE с ключом /E, то вы перенесете все файлы, директории (включая файлы внутри них) и пустые директории. Файлы и директории удалятся из исходной папки. /MOVE с /S даст такой же результат, но пустые директории не перенесутся и будут удалены.
  • Если вы используете ключ /MOV с ключом /E, то вы перенесете все файлы, включая те, которые находятся в директориях и поддиректориях, также скопируются все директории (включая пустые), но они не будут удалены из исходного каталога, в отличие от файлов. Используя /MOV с /S, вы получите такой же результат, но пустые директории не будут скопированы.

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

Для примера возьмём задачу: нам необходимо с помощью robocopy регулярно синхронизировать содержимое сетевой папки между двумя серверами с ведением логов.

Запустите командную строку с правами администратора и введите: compmgmt.msc

Перейдите в System Tools -> Task Scheduler Library. Создайте новое задание планировщика (Create task).

создать задание планировшика robocopy

Укажите имя задания, и выберите пользователя из-под которого будет выполняться задание. Пользователь должен иметь доступ на чтению и запись в обоих каталогах (при копировании по сети между серверами домена можно использовать аккаунт System, в этом случае нужно предоставить на целевой каталог права RW для объекта computer сервера-источника) .

Выберите опцию Run whether user is logged on or not, для того чтобы задание выполнялось в фоновом режиме. Также отметьте Run with highest privileges. Эта опция сработает если аккаунт из-под которого выполняется задание, будет иметь права администратора.

задание зеркалирования robocopy

Перейдите на вкладку 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 на нужный вам путь.

запуск команды robocopy через планировшик

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

события запуска задания планировщика

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

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

журнал запуска планировщика robocopy

Отслеживание изменений в каталогах с помощью 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, которые можно использовать для обработки различных ошибок, которые возвращает утилита после выполнения действия копирования (кот возврата эта битовая маска).

HexDecimalMeaning if set
0x000No errors occurred, and no copying was done. The source and destination directory trees are completely synchronized.
0x011One or more files were copied successfully (that is, new files have arrived).
0x022Some Extra files or directories were detected. No files were copied Examine the output log for details.
0x044Some Mismatched files or directories were detected. Examine the output log. Housekeeping might be required.
0x088Some files or directories could not be copied (copy errors occurred and the retry limit was exceeded). Check these errors further.
0x1016Serious 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.
Коды возврата могут комбинироваться:
0x033(2+1) Some files were copied. Additional files were present. No failure was encountered.
0x055(4+1) Some files were copied. Some files were mismatched. No failure was encountered.
0x066(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
0x077(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 или используете цепочки автоматизации с другими языками программирования.

Читайте также: