我似乎无法在命令行上找到一种方法来说“将目录A中的所有文件复制到目录B,但如果文件已存在于目录B中,请不要覆盖它,不管是哪一个文件较新,不提示我。“
我经历过复制,移动,xcopy和amp; robocopy,我能得到的最接近的是你可以告诉robocopy“将A复制到B,但不要用旧文件覆盖更新的文件”,但这对我不起作用。我查看了xxcopy,但放弃了它,因为我不想对Visual Studio后期构建事件有第三方依赖,这将要求其他SVN用户安装该工具以进行构建。
我想在Visual Studio 2010中的post-build事件中添加命令行,以便从T4模板生成的新EF模型对象的文件分发到项目文件夹它们属于哪个,但现有对象的重新生成的文件不会覆盖可能已编辑的目标文件。
由于T4模板重新生成,源文件总是更新,我不能可靠地使用“更新”的开关,我不认为。
我为那些可以使用的项目使用了部分类,但是我生成的其他内容不能使用部分类(例如,生成默认的EditorTemplate或DisplayTemplate * .ascx文件)。
任何人都有类似问题已经解决了吗?
答案 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完全符合原始海报的要求 - 无需加载脚本环境。
参考文献:Technet,Wikipedia
下载地址: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会“删除更新”文件,但它会排除比目标目录中的副本更新的文件。 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}}
在实施前进行测试。