108

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

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

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

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

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

有没有人解决过类似的问题?

4

12 回答 12

222

Robocopy“Robust File Copy”是一个命令行目录复制命令。从 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 通常会覆盖这些。

由于排除了 Changed、Older 和 Newer 类,Robocopy 完全按照原始发布者的要求进行 - 无需加载脚本环境。

参考:Technet维基百科
下载自:Microsoft 下载链接 (链接最后验证于 2016 年 3 月 30 日)

于 2010-11-19T20:05:53.183 回答
52

你可以试试这个:

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

-y在覆盖之前简单地提示,我们可以将 n 传递给所有这些问题。所以这本质上只是复制不存在的文件。:)

于 2014-05-22T16:14:43.530 回答
48

贝利撒留的解决方案很好。

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

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

由于排除了 Changed、Older 和 Newer 类,Robocopy 完全按照原始发布者的要求进行 - 无需加载脚本环境。

于 2010-12-06T08:17:39.680 回答
42
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"
于 2010-11-19T20:04:21.890 回答
6

这是批处理文件的形式:

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"
于 2010-11-19T20:06:49.110 回答
4

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

echo nnnnnnnnnnn | xcopy /-y source target

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

于 2015-03-23T18:19:48.727 回答
3

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

@Hydrargyrum 写道:

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

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

当然,像往常一样做你自己的测试。

于 2013-04-16T12:40:40.483 回答
3
robocopy src dst /MIR /XX

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

于 2017-02-12T16:13:00.283 回答
1

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

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

请记住将路径设置为 robocopy exe。您可以通过右键单击“我的电脑”>“属性”>“高级”>“环境变量”来执行此操作,然后找到路径系统变量并将其添加到末尾:“;C:\Program Files\Windows Resource Kits\Tools”或任何你想要的地方安装它。确保保留已经存在的路径变量字符串,并附加附加路径。

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

于 2012-04-09T15:37:46.050 回答
1

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

Exclude Older/Newer files 选项与 RoboCopy 的日志中显示的信息一致:RoboCopy 将遍历 SOURCE,然后报告 SOURCE 中的每个文件是否比目标中的文件“旧”或“新”。

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

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

于 2016-05-08T16:49:23.927 回答
0

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

robocopy <source directory> <destination directory> *.* /MIR
于 2016-06-17T10:25:57.463 回答
0

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

批处理文件: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\

在实施之前进行测试。

于 2016-12-14T03:07:46.740 回答