Скопировать файлы без перезаписывания

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

Вопрос:

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

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

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

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

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

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

Лучший ответ:For %F In («C:From*.*») Do If Not Exist «C:To%~nxF» Copy «%F» «C:To%~nxF» Ответ №1

Robocopy или “Robust File Copy” – команда репликации в командной строке. Он был доступен как часть набора ресурсов Windows, начиная с 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 исключает существующие файлы с
    та же самая временная метка, но другая
    размер файла. Robocopy обычно перезаписывает их.
  • /XN исключает существующие файлы newer
    чем копия в месте назначения
    каталог. Robocopy обычно
    перезаписывает их.
  • /XO исключает
    существующие файлы старше
    чем копия в месте назначения
    каталог. Robocopy обычно
    перезаписывает их.

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

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

Ответ №2

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

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

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

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

Ответ №3

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

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

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

Ответ №4

Здесь он находится в виде пакетного файла:

@echo off set source=%1 set dest=%2 for %%f in (%source%*) do if not exist «%dest%%%~nxf» copy «%%f» «%dest%%%~nxf» Ответ №5

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

@Hydrargyrum писал (а):

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

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

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

Ответ №6

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

echo nnnnnnnnnnn | xcopy /-y source target

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

Ответ №7robocopy src dst /MIR /XX

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

Ответ №8

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

(для установки не требуется перезагрузка)

Не забудьте указать свой путь к robocopy exe. Вы делаете это, щелкнув правой кнопкой мыши “Мой компьютер” > “Свойства” > “Дополнительно” > “Переменные среды”, затем найдите системную переменную пути и добавьте это в конец: “; C:Program FilesWindows Resource KitsTools” или где угодно установил его. Не забудьте оставить строки переменной пути, которые уже есть, и просто добавить дополнительный путь.

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

Ответ №9

Это не позволит мне прокомментировать непосредственно неправильные сообщения, но позвольте мне просто предупредить всех, что определение опций /XN и/XO REVERSED по сравнению с тем, что было опубликовано в предыдущих сообщениях.

Параметр Exclude Older/Newer совместим с информацией, отображаемой в протоколе RoboCopy: RoboCopy будет выполнять итерацию через SOURCE, а затем сообщать, является ли каждый файл в SOURCE “OLDER” или “NEWER”, чем файл в целевом каталоге.

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

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

Ответ №10

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

robocopy <source directory> <destination directory> *.* /MIR Ответ №11

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

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

@echo off echo Copying echo «%1» echo to «%2» echo. echo Press Cntr+C to abort Pause echo. @echo on robocopy %1 %2 /Xo /XN /XC /J /SL /S /MT:8 /R:1 /W:1 /V /DCOPY:DAT /ETA /COPY:DATO /FFT /A-:SH /XD $RECYCLE.BIN «System Volume Information»

Пример:

robocopy-missingfiles.bat f:Working-folder E:Backup-folder

Проведите проверку перед реализацией.

Оцените статью
Добавить комментарий