xcopy和robocopy之间的区别

81

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

7个回答

83

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

  1. 使用镜像,而XCopy不使用
  2. 有一个/RH选项,允许设置复制运行时间
  3. 有一个/MON:n选项,检查文件差异
  4. 复制比XCopy更多的文件属性

是的,我同意Mark Setchell的观点,它们都很糟糕。(由Microsoft提供)


更新:

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的相关信息请参见此处: https://ss64.com/nt/xcopy.html


4
比起我的回答更有建设性,但不太有趣 :-) - Mark Setchell
8
请注意,XCopy会返回标准的退出代码(成功为零,失败为非零),而Robocopy则不会。 - Gerald Combs
1
我可以告诉你一个巨大的区别,就在3分钟前:你进入网络上的一个目录。Shift-右键单击“在此处打开PowerShell”。然后尝试"robocopy "." "D:\tmp\" /MOV"(**D:**是物理硬盘)。这个命令可以正常工作。关闭共享该目录的计算机(在复制时)。这个命令将无法正常工作,并出现大量错误,请按CTRL-C并重试。robocopy 尝试移动 C:\Windows\System32 目录中的所有文件。确实如此。您不能使用 xcopy 完成此操作。 - Olivier Pons
1
@OlivierPons,我可以重现。这绝对是PowerShell中的一个错误,任何外部命令都会发生相同的情况,而不仅仅是robocopy。这意味着它与此问题无关,因为OP正在批处理中编程,而不是在PowerShell中编程,但如果您必须使用PowerShell,则可以使用其Copy-Item或Move-Item cmdlet代替外部工具,或者您可以给robocopy提供完全限定路径。 - Harry Johnston
@OlivierPons,我只是想澄清问题不在robocopy中,因此使用第三方命令行工具也无法解决问题。至于Powershell问题,我已经提交了一个错误报告,但我不会抱太大希望。[https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/35094757-problem-with-external-commands-when-current-locati] - Harry Johnston
显示剩余2条评论

20

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

补充:为了完整起见,有一个已知的边缘案例问题,即它可能在复制包含无效UTF-16序列名称的文件或目录时悄悄失败。如果这对您造成问题,您可能需要查看第三方工具或编写自己的工具。


1
你能提供描述这种行为的文档链接吗? - Dan Solovay
根据我刚刚经历的,我再也不会使用robocopy了。绝对不安全。微软在发布这样的程序之前应该彻底完成它。你从网络上复制,网络断开,然后它试图从当前位置移动文件... 它是 C:\Windows\System32。干得好,微软,20年过去了还不能制作一个能够正确移动文件的程序。我会向我的学生展示这个例子,让他们明白为什么他们必须转向Linux。 - Olivier Pons
@OlivierPons,我已经使用Robocopy二十年了,从来没有遇到过任何问题。它肯定从未将文件复制到错误的位置!您能否详细解释一下您认为出了什么问题以及如何重现它? - Harry Johnston
那么在20年的时间里,你从来没有在复制时遇到过网络问题。你很幸运,故事就到此为止。请阅读有关“xcopy”与“robocopy”的所有评论和答案...它们自己说明了一切。 - Olivier Pons
2
为了日后的读者受益,Olivier的问题是由Powershell而不是Robocopy引起的 - Harry Johnston
显示剩余3条评论

13

我发现Robocopy有更多选项,但我并没有发现它们特别有用,除非我在做一些特殊的事情。

我对几个复制例程进行了基准测试,并发现XCOPY和ROBOCOPY是最快的,但令我惊讶的是,XCOPY始终比Robocopy表现更好。

具有讽刺意味的是,Robocopy会重试失败的复制,但在我的基准测试中,它也经常失败,而XCOPY从未失败过。

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

这是我在测试中使用的Robocopy开关:

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

如果有人知道更快的组合方法(除了删除/E,因为我需要它),我很乐意听听。

Robocopy 的另一个有趣/令人失望的事情是,如果复制失败,默认情况下会重试1000000次,每次间隔30秒。 如果您正在运行一个长时间的批处理文件而没有人看管,当您在几个小时后回来时,可能会非常失望,发现它仍在尝试复制特定的文件。

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

  • 使用 /R 您可以告诉它重试的次数,
  • /W 让您指定重试之前的等待时间。

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

  • 我的测试都在同一台计算机上进行,并且
  • 从一个外部驱动器复制文件到另一个外部驱动器,
  • 两者均连接到 USB 3.0 端口。

我还在我的测试中包括了 FastCopy 和 Windows Copy,每个测试运行了10次。 注意,它们之间的差异相当显着。 95%置信区间没有重叠。


1
你的回答有点难以阅读,你应该更好地格式化它。你可以使用 ` 来表示 inline 代码 ` (它是波浪线/tilde键,看起来像这样:~),并且输入两次换行符以获得新段落。 - Xander Luciano
抱歉,我写的时候有空行来分隔事物。 - SixSigmaGuy
我曾经遇到很多ROBOCOPY失败的问题,因为有些人离开公司后会从Active Directory中删除用户帐户,而他们的SIDs是某些文件的所有者或在它们的DACLs中。每当robocopy遇到这样的文件时,它就会崩溃。那真是一场噩梦。 - Spencer
1
性能:使用 /log:mylogfile.log,比在屏幕上显示更快。这在复制数百万个文件时很重要。还可以使用 /MT 添加更多核心(默认为 8,我的当前桌面有 24 个核心),但更好的方法是并行启动 n 个单线程 robocopy 作业(n = 核心数)。如果您计划复制数百万个文件,请先复制文件,然后再复制 ACL。 - Sylvain Rodrigue

4

听到人们仍然在* {COPY}的手中受苦,这让人感到痛心。 我是一名经验丰富的批处理和Bash脚本编写者,我推荐使用rsync,您可以在cygwin(cygwin.org)中运行它,或者您可以找到一些浮动的二进制文件。 并且您可以将输出重定向到2>&1,以便将其记录到日志文件(如out.log)中以供以后分析。 祝大家好运,是时候重新热爱生活了。 = M.Kaan =


或者永远选择Linux也不错。在我看来,这是更好的选择。 - Olivier Pons
经过2-3次使用Robocopy,一开始看起来还不错,但我会尝试rsync。Robocopy有很多问题,总结完全错误,多线程的默认值对我复制的所有内容来说都非常慢/错误,恢复操作也无法正常工作。只需查看github存储库和问题,就可以看出它远非好产品。它甚至覆盖了System Volume Info和恢复目录,并破坏了驱动器。难以置信。 - 98percentmonkey
我是一个被困在Windows世界中的Linux粉丝。我依赖于msys2来保持理智。然而,在msys下,rsync在本地磁盘复制操作中速度太慢了,而且我找不到使用mingw64编译的rsync。也许我做错了什么,但robocopy解决了我的速度问题(虽然没有复制验证,我会把速度差异归咎于此,尽管在Linux下它仍然非常快)。 - Johann

3
我已经编写了许多脚本来自动备份等日常任务。以前我使用 XCopy,然后转向使用 Robocopy。无论如何,在 Windows 中进行文件传输时,Robocopy 和 XCopy 都经常被使用。Robocopy 代表强大的文件复制。这两个命令都用于所有类型的大文件复制,但是 Robocopy 增加了一些选项,使得复制更加容易,并且用于调试目的。
话虽如此,让我们谈谈这两者之间的特点。
  • Robocopy非常适合镜像或同步目录。它还会检查目标目录中的文件与要复制的文件进行比较,并且不会浪费时间复制未更改的文件。

  • 如果你和我一样喜欢自动化来进行每日备份等任务,“运行小时数 - /RH”变得非常有用,而无需任何交互。这是Robocopy支持的功能。它允许您设置副本应该在何时执行,而不是像XCopy那样根据命令时间。您将在任务列表中看到robocopy.exe进程,因为它将在后台运行以监视时钟并在正确的时间执行复制。

  • Robocopy支持使用“/MON”或“/MOT”命令对文件和目录进行监视。

  • Robocopy在复制文件时额外支持复制文件的“存档”属性,支持复制所有属性,包括时间戳、安全性、所有者和审计信息。

希望这可以帮助您。


当您使用/RH时,这是否意味着该命令将始终在指定时间运行,即使在重新启动后也不需要任何交互? - SRR

0
最近我需要复制12TB的数据以准备进行RAID转换。在我的研究和经验中,我最终使用了xcopy命令,并使用了以下参数:
xcopy D: E: /C/H/E/R/Y/D /EXCLUDE:C:\EXCLUDE.TXT

排除文件需要由PC管理员创建,否则将无法解释。在排除文件中,每行添加一个目录。然后,使用命令行界面,以管理员身份执行xcopy命令。另外,我需要创建一个到我的其他PC的链接,例如"net use E:"等等...否则,如果从右键菜单创建了映射驱动器,驱动器字母将无法工作。

就速度而言,我发现xcopy比robocopy快得多。我尝试了多个robocopy参数,但在我的会话中它似乎从未像xcopy那样起飞。此外,我可以随时使用"CMD C"选项停止复制会话,并在之后返回到离开的地方,没有任何问题。Robocopy表现出相同的行为,所以在这方面没有区别。


-5

6
现在,默认情况下copy命令会在处理二进制文件时使用/b参数。我不确定你为什么讨厌robocopy,你提供的链接只显示了archive属性被按设计方式使用。 - foxidrive
8
你能否更具建设性地提出一些替代方案呢? - Mark Cooper
14
@MarkSetchell 的回答很糟糕。从您的声望来看,您应该知道得更好。 - Mark Cooper
11
@MarkSetchell,你没有回答提问者的问题,而是表达了你自己对XCOPY和ROBOCOPY的厌恶程度。这并不是事实,也不具有建设性,对于提问者没有任何帮助。 - Mark Cooper
8
一旦你了解历史,这就说得通了。 copyxcopy 都是DOS的组成部分,它们必须是分开的,因为copy是内部命令,而xcopy则是外部命令。 Windows将它们都包含在内,以保持向后兼容性。 robocopy 命令最初由一个独立团队开发,最初用于内部使用,后来作为资源工具包的一部分。直到后来,它才成为Windows的内置部分。(我对“shell编程没有陡峭的学习曲线”这种说法也有怀疑。 语法相当晦涩!) - Harry Johnston
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接