复制文件而不覆盖

Ton*_*ony 91 windows xcopy batch-file robocopy

我似乎无法在命令行上找到一种方法来说"将目录A中的所有文件复制到目录B,但如果文件已存在于目录B中,请不要覆盖它,无论哪个文件更新,不要催促我."

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

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

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

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

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

Dr.*_*ius 188

的Robocopy,或者"强大的文件复制",是一个命令行目录复制命令.它已作为Windows资源工具包的一部分从Windows NT 4.0开始提供,并作为Windows Vista,Windows 7和Windows Server 2008的标准功能引入.

   robocopy c:\Sourcepath c:\Destpath /E /XC /XN /XO
Run Code Online (Sandbox Code Playgroud)

详细说明(使用Hydrargyrum,HailGallaxar和Andy Schmidt答案):

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

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

参考文献:Technet,Wikipedia
下载来自:Microsoft Download Link (链接最后一次验证,2016年3月30日)


Hyd*_*rum 46

Belisarius的解决方案很好.

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

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

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


sac*_*n11 42

你可以试试这个:

echo n | copy /-y <SOURCE> <DESTINATION>
Run Code Online (Sandbox Code Playgroud)

-y只需在覆盖之前提示,我们就可以将所有这些问题告诉管理员.所以这实际上只是复制不存在的文件.:)

  • 当我们只管道一次时,为什么它会回答所有问题? (5认同)
  • @phuclv 一旦标准输入用完输入,“copy /-y”似乎会自动假设“否”。您可以省略第一个显式的“n”,或者通过管道将“&lt; nul”插入其中,并且会发生相同的事情。 (3认同)
  • 漂亮简单。 (2认同)

Stu*_*Stu 36

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

  • 这对我有用,但我必须使用两个百分号而不是一个,因为我在批处理文件而不是命令行中运行它.我用%% F替换%F的实例,用%% ~nxF替换%~nxF的实例. (4认同)
  • `%~nxF` 中的 `~nx` 到底是什么意思? (2认同)

Gab*_*abe 6

这是批处理文件形式:

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


Ada*_*uth 5

使用 xcopy 有一种奇怪的方法可以做到这一点:

echo nnnnnnnnnnn | xcopy /-y source target
Run Code Online (Sandbox Code Playgroud)

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

  • 关于“copy”,请参阅[此答案](/sf/answers/1666852561/),特别是@mwfearnley评论:一旦标准输入用尽,“copy /-y”会自动假定“n”,因此您可以例如“echo n”仅一次,它仍然有效。 (2认同)