xcopy 和 robocopy 的区别

Posted

技术标签:

【中文标题】xcopy 和 robocopy 的区别【英文标题】:Difference between xcopy and robocopy 【发布时间】:2014-07-30 00:55:42 【问题描述】:

我对批处理脚本有点陌生。 作为一个新手,我发现它们在编写脚本时都很有用 xcopy 和 robocopy 之间的主要区别是什么?

【问题讨论】:

【参考方案1】:

Robocopy 在较新版本的 Windows 中取代了 XCopy

    使用镜像,XCopy 不使用 有一个 /RH 选项允许复制运行设定时间 有一个 /MON:n 选项来检查文件中的差异 复制比 XCopy 更多的文件属性

是的,我同意 Mark Setchell 的观点,他们都是垃圾。 (由微软提供)


更新:

XCopy 返回码:

0 - Files were copied without error.
1 - No files were found to copy.
2 - The user pressed CTRL+C to terminate xcopy. enough memory or disk space, or you entered an invalid drive name or invalid syntax on the command line.
5 - Disk write error occurred.

Robocopy 返回代码:

0 - No errors occurred, and no copying was done. The source and destination directory trees are completely synchronized.
1 - One or more files were copied successfully (that is, new files have arrived).
2 - Some Extra files or directories were detected. No files were copied Examine the output log for details. 
3 - (2+1) Some files were copied. Additional files were present. No failure was encountered.
4 - Some Mismatched files or directories were detected. Examine the output log. Some housekeeping may be needed.
5 - (4+1) Some files were copied. Some files were mismatched. No failure was encountered.
6 - (4+2) Additional files and mismatched files exist. No files were copied and no failures were encountered. This means that the files already exist in the destination directory
7 - (4+1+2) Files were copied, a file mismatch was present, and additional files were present.
8 - Some files or directories could not be copied (copy errors occurred and the retry limit was exceeded). Check these errors further.
16 - Serious error. Robocopy did not copy any files. Either a usage error or an error due to insufficient access privileges on the source or destination directories.

这里有更多关于 Robocopy 返回值的详细信息:http://ss64.com/nt/robocopy-exit.html

【讨论】:

比我的回答更有建设性,但没有那么有趣:-) 请注意,XCopy 返回标准退出代码(成功时为零,失败时为非零),而 Robocopy 不会。 是否有任何(免费和/或开源)更好的解决方案可以将 Windows 服务器中的文件自动备份到另一个 Windows 服务器?我的公司有太多的 windows 服务器,他们不给我钱来为这个任务购买任何许可证。 我可以告诉你一个 f..kin 的重大变化,我刚刚在 3 分钟前发现:你转到了网络上的一个目录。 Shift-右键单击“在此处打开 powershell”。然后尝试“robocopy "." "D:\tmp\" /MOV”(D: 是物理硬盘)。这项工作。关闭共享该目录的计算机(复制时)。这不适用于大量错误,请按 CTRL-C 并重试。 robocopy 已尝试从 C:\Windows\System32 目录中移动所有文件。真的。 xcopy 无法做到这一点。 @OlivierPons,我可以复制。绝对是 Powershell 中的一个错误,任何外部命令都会发生同样的事情,而不仅仅是 robocopy。这意味着它与这个问题并不真正相关,因为 OP 正在批量编程,而不是在 Powershell 中,但如果您必须使用 Powershell,那么您可以使用其 Copy-Item 或 Move-Item cmdlet外部工具,或者您可以为 robocopy 提供完全限定的路径。【参考方案2】:

最重要的区别是robocopy(通常)会在发生错误时重试,而xcopy 不会。在大多数情况下,这使得 robocopy 更适合在脚本中使用。

附录: 为了完整起见,robocopy 存在一个已知的边缘情况问题; it may silently fail to copy files or directories whose names contain invalid UTF-16 sequences. 如果这对您来说是个问题,您可能需要查看第三方工具,或者自己编写。

【讨论】:

你能链接到描述这种行为的文档吗? 用我刚刚拥有的东西,我再也不会使用robocopy了。永远不能。一点都不安全。 Microsoft 应该在发布之前正确完成此类程序。您从网络复制,网络已关闭,然后它尝试从它所在的位置移动文件......它是C:\Windows\System32。干得好微软,20 年后仍然无法制作一个可以正确移动文件的程序。我将向我的学生展示这个示例,以便他们了解为什么必须使用 Linux。 @OlivierPons,我使用 robocopy 已有 20 年了,从未遇到过任何问题。当然,它从来没有将文件复制到错误的地方或从错误的地方复制出来!您能否更详细地解释您认为出了什么问题以及如何重现它? 所以在 20 年里,您在复制时从未遇到过网络问题。你很幸运,故事结束。并阅读所有关于 xcopyrobocopy 的 cmets 和答案......他们自己说话。 为了未来读者的利益,Olivier's problems were caused by Powershell, not Robocopy。【参考方案3】:

我可以看到的不同之处在于 Robocopy 有更多的选择,但我没有发现其中任何一个特别有用,除非我正在做一些特别的事情。

我对几个复制例程进行了一些基准测试,发现 XCOPY 和 ROBOCOPY 最快,但令我惊讶的是,XCOPY 始终超过 Robocopy。

具有讽刺意味的是,robocopy 重试失败的副本,但它在我的基准测试中也失败了很多,而 xcopy 从未这样做过。

我在基准测试后进行了完整文件(逐字节)文件比较。

以下是我在测试中与 robocopy 一起使用的开关:

 **"/E /R:1 /W:1 /NP /NFL /NDL"**.  

如果有人知道更快的组合(除了删除 /E,我需要),我很想听听。

robocopy 的另一个有趣/令人失望的事情是,如果副本确实失败,默认情况下它会重试 1,000,000 次,每次尝试之间有 30 秒的延迟。如果您在无人看管的情况下运行较长的批处理文件,当您在几个小时后回来发现它仍在尝试复制特定文件时,您可能会非常失望。

/R 和 /W 开关可让您更改此行为。

使用 /R 可以告诉它重试多少次, /W 让我们指定重试前的等待时间。

如果有办法在此处附加文件,我可以分享我的结果。

我的测试都是在同一台计算机上完成的,并且 将文件从一个外部驱动器复制到另一个外部驱动器, 都在 USB 3.0 端口上。

我还在我的测试中加入了 FastCopy 和 Windows Copy,每个测试运行了 10 次。请注意,差异非常显着。 95% 置信区间没有重叠。

【讨论】:

你的回答有点难读,你应该多格式化一下。您可以使用` 表示inline 代码`(它看起来像这样的波浪线/波浪号键:~)并输入两次以获得新段落。 对不起,我写的时候有空行来分隔东西。 我在 ROBOCOPY 失败时遇到了很多问题,因为人们过去常常在离开公司时从 Active Directory 中删除用户帐户,而他们的 SID 是某些文件或 DACL 中的所有者。每当 robocopy 碰到这样的文件时,它就会崩溃。这是一场噩梦。【参考方案4】:

听到人们仍然在受苦 *COPY 无论版本。 我是一个经验丰富的批处理和 Bash 脚本编写者,我推荐 rsync ,您可以在 cygwin (cygwin.org) 中运行它,或者您可以找到一些浮动的二进制文件。 您可以将输出重定向到 2>&1 到一些日志文件,如 out.log 以供以后分析。 祝人们好运,是时候重新热爱生活了。 =M。卡恩=

【讨论】:

或者永远选择 Linux。恕我直言,更好的选择。 在使用 Robocopy 2-3 后,起初看起来不错,我会尝试 rsync。 Robocopy 有可怕的问题,总结完全错误,对于我复制的所有内容,多线程的默认值大多完全错误/缓慢,恢复不起作用。看看 github repo 和问题,它远非一个好产品。它甚至会覆盖系统卷信息和恢复目录并破坏驱动器。难以置信。【参考方案5】:

我编写了很多脚本来自动执行每日备份等。之前我使用 XCopy,然后转移到 Robocopy。无论如何,Robocopy 和 XCopy 都经常用于 Windows 中的文件传输。 Robocopy 代表强大的文件复制。使用所有类型的大文件复制这两个命令,但 Robocopy 添加了选项,使复制更容易以及用于调试目的。

话虽如此,让我们谈谈这两者之间的功能。

Robocopy 可以方便地镜像或同步目录。它 还根据文件检查目标目录中的文件 被复制并且不会浪费时间复制未更改的文件。

就像我一样,如果您喜欢自动化以进行每日备份 等等,“运行时间 - /RH”在没有任何交互的情况下变得非常有用。 这得到了 Robocopy 的支持。它允许您设置何时复制 应该完成而不是像 XCopy 那样在命令的时间完成。你 将在任务列表中看到 robocopy.exe 进程,因为它将运行 后台监控时钟以在合适的复制时间执行。

Robocopy 支持使用“/MON”或 “/MOT”命令。

Robocopy 为通过“存档”属性进行复制提供了额外的支持 在文件上,它支持复制所有属性,包括 时间戳、安全性、所有者和审计信息。

希望对你有所帮助。

【讨论】:

当您使用 /RH 时,这是否意味着该命令将始终在该时间运行而无需任何交互,即使在重新启动后也是如此?【参考方案6】:

他们都是垃圾! XCOPY 较旧且不可靠,因此微软将其替换为 ROBOCOPY,这仍然是垃圾。

http://answers.microsoft.com/en-us/windows/forum/windows_8-files/robocopy-appears-to-be-broken-in-windows-8/9a7634c4-3a9d-4f2d-97ae-093002a638a9

不过不用担心,这是一个由原始 COPY 命令开始的悠久传统,直到今天,它仍然需要 /B 开关才能使其真正正确复制!

【讨论】:

copy 现在在二进制文件上默认为 /b。我不确定你从哪里得到你对 robocopy 的仇恨......你的链接只是表明 archive 属性正在按照设计的方式使用。 您能否更具建设性并提出替代方案? @MarkSetchell 糟糕的回答。从你的代表来看,你应该知道得更多。 @MarkSetchell 您还没有回答 OP 的问题,而是就您对 XCOPY 和 ROBOCOPY 的厌恶程度发表了自己的看法。这不是事实,没有建设性,对 OP 没有任何帮助。 @OK9999:一旦你了解了历史,它就有意义了。 copyxcopy 都是 DOS 的一部分,它们必须分开,因为 copy 是内部命令,xcopy 是外部命令。 Windows 将它们都包含在内是为了向后兼容。 robocopy 命令最初是由一个单独的团队开发的,最初供内部使用,后来作为资源工具包的一部分。直到后来,它才成为 Windows 的内置部分。 (我也怀疑 shell 编程没有陡峭的学习曲线的说法。语法非常深奥!)

以上是关于xcopy 和 robocopy 的区别的主要内容,如果未能解决你的问题,请参考以下文章

复制命令(ROBOCOPY)

Robocopy命令实现文件服务器镜像备份/增量备份操作

CMD用robocopy 怎样不覆盖已存在的文件?

xcopy和copy有什么区别?

DOS中XCOPY与COPY 的联系与区别是啥,如何使用

复制文件而不覆盖