复制文件没有覆盖

问题描述:

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

我已经通过复制,移动,xcopy & robocopy,而且我能得到的最接近的是你可以告诉robocopy“复制A到B,但不要用较旧的文件覆盖较新的文件”,但是这并不是'为我工作。我查看了xxcopy,但放弃了它,因为我不希望第三方依赖于Visual Studio后构建事件,这将需要其他SVN用户安装该工具才能完成构建。

我希望将命令行添加到生成后事件在Visual  工作室  2010,使得从T4模板新EF模型对象生成的文件被分配到其所属的项目文件夹,但现有对象的重新生成的文件不会覆盖潜在编辑的目标文件。

由于T4模板再生,源文件始终是新的,我不能用“新”切换可靠,我不认为。

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

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

+0

您是否熟悉'cmd.exe'的'for'命令?如果没有,我建议你运行'for /?'并使用它。 – Gabe 2010-11-19 19:54:52

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

这对我有效,但我不得不使用两个百分比符号而不是一个,因为我是从批处理文件而不是命令行运行的。我用%% F替换%F的实例,用%%〜nxF替换%〜nxF的实例。 – Owen 2016-06-17 07:37:18

+0

'%〜nxF'中的'〜nx'究竟意味着什么? – 2016-08-27 17:21:38

+0

@Serge:长故事。运行FOR /?阅读它。 – Stu 2016-08-29 12:59:02

的Robocopy或 “鲁棒文件复制”,是一个命令行目录复制命令。它已经作为Windows资源工具包开始使用Windows NT 4.0的一部分,并且被介绍为Windows Vista中,Windows 7和Windows Server的一个标准功能2008

robocopy c:\Sourcepath c:\Destpath /E /XC /XN /XO 

为了详细说明(使用汞,HailGallaxar和安迪·施密特回答):

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

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

参考文献:TechnetWikipedia
下载来自:Microsoft Download Link(链接去年03月30核实,2016)

+0

按'排除'你的意思是'跳过'或'删除/删除'? – 2013-10-14 17:37:21

+0

@Andre Terra:通常跳过。如果您使用/ MIR标志,则可能会将其删除。我没有测试过。 – Hydrargyrum 2013-12-04 23:33:46

+0

使用/ MIR时,源中不存在的文件确实被删除。但是,当还使用/ XN和/ XO时,两个地方存在的文件都会被略过(不确定是否检查了大小)。这对于我需要复制我的应用程序的较新版本或较旧版本但应用程序使用的库的dateModified邮票不正确但文件名本身包含其版本号的情况非常理想。 – 2015-08-05 11:18:55

这是批处理文件的形式:

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

这应该是第一个答案... – thab 2016-02-18 22:04:47

+0

啊,我喜欢像'%\ %%〜'这样的“很多”的序列...... – avp 2016-08-26 13:17:01

贝利萨留的解决方案是好。

为了详细说明稍微简洁的回答:

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

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

Robocopy可以在此处下载,以查找尚未安装的系统。 (即Windows Server 2003中)

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

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

一旦设置了路径,就可以运行belisarius建议的命令。它效果很好。

我只是想澄清一下我自己的测试。

@Hydrargyrum写道:

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

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

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

+1

这是对原始问题的回答,还是对别人的回答的评论? – ASGM 2013-04-16 13:06:19

+1

Hydrargyrum的答案是,在回答原始问题时还有25票,还是评论他人的答案? – 2013-05-09 22:28:33

你可以试试这个:

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

-y覆盖前简单的提示,我们可以管N到所有这些问题。所以这实质上就是复制不存在的文件。 :)

+0

很酷。不知道Windows可以这样管道。 – avp 2016-08-26 13:11:39

+1

非常简单。 – Holf 2016-11-01 14:25:07

+0

应该被接受回答 – 2017-05-09 14:04:55

没有与XCOPY做到这一种奇怪的方式:

echo nnnnnnnnnnn | xcopy /-y source target 

就包括许多个n为你复制文件,它会回答n所有的覆盖问题。

+0

这是一个无聊,但它的作品。 (我用拷贝。) – 2015-05-08 20:20:00

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

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

因此,/ 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\ 

实施之前做测试。

robocopy src dst /MIR /XX 

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