复制文件而不覆盖

时间:2010-11-19 19:50:42

标签: windows batch-file xcopy robocopy

我似乎无法在命令行上找到一种方法来说“将目录A中的所有文件复制到目录B,但如果文件已存在于目录B中,请不要覆盖它,不管是哪一个文件较新,不提示我。“

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

我想在Visual Studio 2010中的post-build事件中添加命令行,以便从T4模板生成的新EF模型对象的文件分发到项目文件夹它们属于哪个,但现有对象的重新生成的文件不会覆盖可能已编辑的目标文件。

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

我为那些可以使用的项目使用了部分类,但是我生成的其他内容不能使用部分类(例如,生成默认的EditorTemplate或DisplayTemplate * .ascx文件)。

任何人都有类似问题已经解决了吗?

12 个答案:

答案 0 :(得分:180)

  

Robocopy 或“强大的文件复制”是一个命令行目录复制命令。它已作为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将现有文件排除在外 而不是目的地的副本 目录。通常是机器人 覆盖那些。
  • /XO排除 现有文件较旧 而不是目的地的副本 目录。通常是机器人 覆盖那些。

排除Changed,Older和Newer类后,Robocopy完全符合原始海报的要求 - 无需加载脚本环境。

参考文献:TechnetWikipedia
下载地址:Microsoft Download Link (链接最后一次验证,2016年3月30日)

答案 1 :(得分:43)

Belisarius的解决方案很好。

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

  • /E使Robocopy以递归方式复制子目录, 包括空的。
  • /XC将现有文件排除在外 相同的时间戳,但不同 文件大小。 Robocopy通常会覆盖那些。
  • /XN将现有文件排除在外 而不是源中的副本 目录。通常是机器人 覆盖那些。
  • /XO排除 现有文件较旧 而不是源中的副本 目录。通常是机器人 覆盖那些。

排除Changed,Older和Newer类后,Robocopy完全符合原始海报的要求 - 无需加载脚本环境。

答案 2 :(得分:39)

你可以试试这个:

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

-y只是在覆盖之前提示,我们可以将n管道传达给所有这些问题。所以这实际上只是复制不存在的文件。 :)

答案 3 :(得分:33)

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

答案 4 :(得分:6)

这是批处理文件格式:

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

答案 5 :(得分:3)

我只想澄清自己的测试内容。

@Hydrargyrum写道:

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

这实际上是倒退了。 XN会“删除更新”文件,但它会排除比目标目录中的副本更新的文件。 XO“eXclude Older”,但它排除了比 destination 目录中的副本旧的文件。

当然,一如既往地进行自己的测试。

答案 6 :(得分:3)

使用xcopy有一种奇怪的方法:

echo nnnnnnnnnnn | xcopy /-y source target

只需包含与您正在复制的文件一样多的n,它将回答所有覆盖问题的n。

答案 7 :(得分:3)

robocopy src dst /MIR /XX

/ XX:eXclude“eXtra”文件和目录(存在于目的地但不是源)。这样可以防止从目的地删除任何内容。 (这是默认值)

答案 8 :(得分:1)

可以在此处下载Robocopy,以用于尚未安装的系统。 (即Windows Server 2003.)

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

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

设置路径后,您可以运行belisarius建议的命令。它很棒。

答案 9 :(得分:1)

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

Exclude较旧/较新文件选项与RoboCopy日志记录中显示的信息一致:RoboCopy将遍历SOURCE,然后报告SOURCE中的每个文件是“OLDER”还是“NEWER”而不是目标文件。

因此,/ XO将排除OLDER SOURCE文件(这是直观的),而不是像此处声明的那样“比源更旧”。

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

答案 10 :(得分:0)

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

robocopy <source directory> <destination directory> *.* /MIR

答案 11 :(得分:0)

这对我有用。我使用它来“添加”文件到另一个驱动器,没有覆盖。

批处理文件:robocopy-missingfiles.bat

{{1}}

示例:

{{1}}

在实施前进行测试。