复制文件而不覆盖

我似乎无法在命令行上find一种方法来说“将所有文件从目录A复制到目录B,但如果目录B中已经存在该文件,则不要覆盖它,不pipe哪个文件更新,不要提示我。“

我已经通过复制,移动,xcopy和robocopy,而且我能得到的最接近的是,你可以告诉robocopy“复制A到B,但不要用较旧的文件覆盖较新的文件”,但这对我不起作用。 我查看了xxcopy,但放弃了它,因为我不想在Visual Studio后构build事件上有第三方依赖关系,这将需要其他SVN用户安装该工具才能进行构build。

我想将一个命令行添加到Visual Studio 2010中的生成后事件中,以便从新的EF模型对象的T4模板生成的文件分配到它们所属的项目文件夹,但为现有对象重新生成文件不要覆盖潜在编辑的目标文件。

由于T4模板重新生成,源文件总是更新,我不能可靠地使用“更新”的开关,我不这么认为。

我使用部分类为我可以,但也有其他事情我生成不能使用部分类(例如生成一个默认的EditorTemplate或DisplayTemplate * .ascx文件)。

任何人有任何类似的问题,他们已经解决了?

 For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF" 

Robocopy 或“可靠的文件复制”是命令行目录复制命令。 它已经作为从Windows NT 4.0开始的Windows资源工具包的一部分提供,并作为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排除比目标目录中的副本更新的现有文件。 Robocopy通常覆盖这些。
  • /XO排除比目标目录中的副本旧的现有文件。 Robocopy通常覆盖这些。

随着更改,更旧和更新的课程被排除,Robocopy完全按照原始的海报要求 – 无需加载脚本环境。

参考文献: Technet , 维基百科
从下载: Microsoft下载链接 (链接上次验证2016年3月30日)

Belisarius的解决方案是好的。

为了详细说明这个稍微简洁的答案:

  • /E使Robocopy递归复制子目录,包括空的。
  • /XC排除具有相同时间戳但文件大小不同的现有文件。 Robocopy通常覆盖这些。
  • /XN排除比源目录中的副本更新的现有文件。 Robocopy通常覆盖这些。
  • /XO排除比源目录中的副本更早的现有文件。 Robocopy通常覆盖这些。

随着更改,更旧和更新的课程被排除,Robocopy完全按照原始的海报要求 – 无需加载脚本环境。

你可以试试这个:

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

只是在覆盖之前提示,我们可以向所有这些问题提出建议。 所以这实质上就是复制不存在的文件。 🙂

这里是批处理文件格式:

 @echo off set source=%1 set dest=%2 for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf" 

我只是想从我自己的测试中澄清一些事情。

@Hydrargyrum写道:

  • / XN排除比源目录中的副本更新的现有文件。 Robocopy通常覆盖这些。
  • / XO排除比源目录中的副本更早的现有文件。 Robocopy通常覆盖这些。

这实际上是倒退。 XN会“排除较新的”文件,但会排除比目标目录中的副本更新的文件。 XO确实“排除旧的”,但排除比目的地目录中的副本更早的文件。

当然,一如既往地做你自己的测试。

有一个奇怪的方式来做到这一点与xcopy:

 echo nnnnnnnnnnn | xcopy /-y source target 

只要包含你正在复制的n个文件,它就会对所有覆盖问题回答n。

 robocopy src dst /MIR /XX 

/ XX:排除“eXtra”文件和目录(目的地但不是来源)。 这将防止从目的地的任何删除。 (这是默认)

Robocopy可以从这里下载到没有安装的系统。 (即Windows server 2003)。

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (安装时不需要重新启动)

请记住将您的路径设置为robocopy exe。 通过右键单击“我的电脑”>属性>高级>“环境变量”,然后找到路径系统变量并将其添加到最后:“; C:\ Program Files \ Windows资源工具包\工具”或无论您身在何处安装它。 确保保留已经存在的路径变量字符串,然后添加addtional路径。

一旦路径被设置,你可以运行belisarius建议的命令。 它工作很好。

它不会让我直接对不正确的消息发表评论 – 但让我只是警告大家,与之前的消息中发布的内容相比,/ XN和/ XO选项的定义是REVERSED。

“排除旧文件/新文件”选项与RoboCopy记录中显示的信息一致:RoboCopy将遍历SOURCE,然后报告源文件中的每个文件是否比目标文件中的“OLDER”或“NEWER”更新。

因此,/ XO将排除OLDER SOURCE文件(这是直观的),而不是像这里所声称的那样“比源代码更老”。

如果您只想复制新的或更改的源文件,但是避免替换更新的目标文件,那么/ XO是正确的选项。

一个简单的方法是使用/ MIR选项来镜像这两个目录。 基本上它只会将新文件复制到目的地。 在下一个命令中,将源文件和目标文件替换为文件夹的路径,脚本将搜索任何具有扩展名的文件。

 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\ 

在实施之前做测试。