Ответ 1
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"
Я просто не могу найти способ в командной строке сказать "скопируйте все файлы из каталога 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"
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 г.)
Решение Велисария хорошее.
Чтобы уточнить этот слегка краткий ответ:
/E
позволяет Robocopy рекурсивно копировать подкаталоги,
включая пустые./XC
исключает существующие файлы с
та же самая временная метка, но другая
размер файла. Robocopy обычно перезаписывает их./XN
исключает существующие файлы
чем копия в источнике
каталог. Robocopy обычно
перезаписывает их./XO
исключает
существующие файлы старше
чем копия в источнике
каталог. Robocopy обычно
перезаписывает их.Если классы Changed, Older и Newer исключены, Robocopy делает именно то, что хочет исходный плакат - без необходимости загружать среду сценариев.
Вы можете попробовать следующее:
echo n | copy /-y <SOURCE> <DESTINATION>
-y
просто запрашивает перед перезаписью, и мы можем передать n всем этим вопросам. Таким образом, это по существу просто копирует несуществующие файлы.:)
Здесь он находится в виде пакетного файла:
@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"
Я просто хочу прояснить что-то из собственного тестирования.
@Hydrargyrum писал (а):
Это наоборот. XN делает файлы "eXclude Newer", но исключает файлы, которые являются более новыми, чем копия в целевом каталоге. XO делает "eXclude Older", но исключает файлы, которые старше копии в целевом каталоге.
Конечно, проводите собственное тестирование, как всегда.
Существует нечетный способ сделать это с помощью xcopy:
echo nnnnnnnnnnn | xcopy /-y source target
Просто включите столько n, сколько файлов, которые вы копируете, и ответьте n на все перезаписываемые вопросы.
robocopy src dst /MIR /XX
/XX: eXclude "eXtra" файлы и директории (присутствующие в пункте назначения, но не исходные). Это предотвратит удаление из адресата. (это значение по умолчанию)
Robocopy можно скачать здесь для систем, где он уже не установлен. (I.e. Windows Server 2003.)
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (для установки не требуется перезагрузка)
Не забудьте указать свой путь к robocopy exe. Вы делаете это, щелкнув правой кнопкой мыши "Мой компьютер" > "Свойства" > "Дополнительно" > "Переменные среды", затем найдите системную переменную пути и добавьте это в конец: "; C:\Program Files\Windows Resource Kits\Tools" или где угодно установил его. Не забудьте оставить строки переменной пути, которые уже есть, и просто добавить дополнительный путь.
Как только путь будет установлен, вы можете запустить команду, предложенную им. Он отлично работает.
Это не позволит мне прокомментировать непосредственно неправильные сообщения, но позвольте мне просто предупредить всех, что определение опций /XN и/XO REVERSED по сравнению с тем, что было опубликовано в предыдущих сообщениях.
Параметр Exclude Older/Newer совместим с информацией, отображаемой в протоколе RoboCopy: RoboCopy будет выполнять итерацию через SOURCE, а затем сообщать, является ли каждый файл в SOURCE "OLDER" или "NEWER", чем файл в целевом каталоге.
Следовательно,/XO будет исключать файлы OLDER SOURCE (что является интуитивно понятным), а не "старше источника", как было заявлено здесь.
Если вы хотите скопировать только новые или измененные исходные файлы, но избегайте замены более поздних файлов назначения, тогда /XO является правильным вариантом.
Простым подходом было бы использовать параметр /MIR для зеркального отображения двух каталогов. В основном он копирует только новые файлы в пункт назначения. В следующем списке замените источник и место назначения на пути к вашим папкам, script будет искать любой файл с любыми расширениями.
robocopy <source directory> <destination directory> *.* /MIR
Это то, что сработало для меня. Я использую это, чтобы "добавить" файлы на другой диск без перезаписи.
Пакетный файл: 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\
Проведите проверку перед реализацией.