Вопрос:
Я просто не могу найти способ в командной строке сказать “скопируйте все файлы из каталога 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
Проведите проверку перед реализацией.