Копировать файлы без перезаписи - PullRequest
88 голосов
/ 19 ноября 2010

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

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

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

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

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

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

Ответы [ 12 ]

181 голосов
/ 19 ноября 2010

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

   robocopy c:\Sourcepath c:\Destpath /E /XC /XN /XO

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

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

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

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

43 голосов
/ 06 декабря 2010

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

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

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

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

39 голосов
/ 22 мая 2014

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

echo n | copy /-y <SOURCE> <DESTINATION>

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

34 голосов
/ 19 ноября 2010
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"
6 голосов
/ 19 ноября 2010

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

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"
3 голосов
/ 12 февраля 2017
robocopy src dst /MIR /XX

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

3 голосов
/ 23 марта 2015

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

echo nnnnnnnnnnn | xcopy /-y source target

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

3 голосов
/ 16 апреля 2013

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

@ Hydrargyrum wrote:

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

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

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

1 голос
/ 08 мая 2016

Это не позволит мне напрямую комментировать неправильные сообщения - но я просто хочу предупредить всех, что определение параметров / XN и / XO ОБРАТНО по сравнению с тем, что было опубликовано в предыдущих сообщениях.

Параметр «Исключить более старые / новые файлы» соответствует информации, отображаемой в журнале RoboCopy: RoboCopy будет перебирать SOURCE и затем сообщать, является ли каждый файл в SOURCE «старше» или «новее», чем файл в месте назначения.

Следовательно, / XO исключит файлы OLDER SOURCE (которые интуитивно понятны), а не «старше источника», как было заявлено здесь.

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

1 голос
/ 09 апреля 2012

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

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (перезагрузка не требуется для установки)

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

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

...