Robocopy命令:数据迁移,文件夹同步等

Robocopy 是 Windows 中最常用的命令行实用程序之一,用于在 Windows 中复制大量数据。它之所以如此受欢迎,是因为它的强大功能。但是,所有这些功能都伴随着复杂性。在本指南中,我们将详细介绍所有这些复杂性,并提供有关使用这个实用工具的完整教程。

Robocopy 是一个 Windows 命令行实用程序,自 Windows NT 以来就已经可用。它是较不灵活的 xcopy 实用程序的替代品。它允许您在命令提示符下指定驱动器路径或服务器路径来复制/移动文件。

截至撰写本文时的 Robocopy 版本为 10.0.18。这是我进行测试的版本。

Robocopy 提供了一系列功能,您可以利用这些功能执行高效快速的文件复制和移动。它可以:

  • 在网络上复制文件并具有恢复功能
  • 可以跳过导致失败的 NTFS 联接点,通常是由于无限循环
  • 可以复制文件和目录属性以保留时间戳
  • 可以复制 NTFS 权限、所有者和审核信息
  • 可以复制目录时间戳
  • 可以以“备份”模式复制文件,以确保即使管理员已被拒绝,文件也会被复制
  • 自动重试
  • 可以同步两个文件夹
  • 足够智能,可以跳过已经复制的文件
  • 可以复制大于 256 个字符路径限制的路径
  • 使用其多线程能力执行异步复制。
  • 返回用于脚本的标准化退出代码

如您所见,有很多要复制的内容。很多。我想覆盖关于这个实用工具的所有您需要了解的内容。

常见的Robocopy语法参考

为什么要在一个单一的实用程序上写这么长的博客文章呢?只需看一下下面的表格。您有很多用于使用robocopy复制或移动文件的选项!您将在各个部分中找到更多选项。

这些表格是从robocopy /?返回的帮助语法中构建的。它们被分成更有意义的部分,随着时间的推移进行了添加,并进行了整理以提供更有用的信息。

源选项

Switch Explanation Default Behavior Equivalent Switch Notes
/S Copy subfolders
/E Copy subfolders including empty subfolders
/COPY:[DATSOU] Copy options /COPY:DAT D=Data, A=Attributes, T=Timestamps S=Security=NTFS ACLs, O=Owner info, U=aUditing info. File Data (D) always includes file Timestamps (T)
/SEC Copy files with SECurity /COPY:DATS
/DCOPY:T Copy directory timestamps
/COPYALL Copy ALL file info /COPY:DATSOU This will prevent dehydrating offline files and will instead copy the file’s tag (on emc VNX/Unity systems at least). This is not officially documented! If dehydration is what you need (reason i found this issue), you can’t copy the ACLs along your files. CREDIT: Monsieurx (Reddit)
/NOCOPY Copy NO file info useful with /PURGE
/A Copy only files with the Archive attribute set
/M like /A, but remove Archive attribute from source files
/LEV:n Only copy the top n LEVels of the source tree
/MAXAGE:n MAXimum file AGE – exclude files older than n days/date
/MINAGE:n MINimum file AGE – exclude files newer than n days/date If n < 1900 then n = no of days, else n = YYYYMMDD date
/FFT Assume FAT File Times 2-second date/time granularity. This replaces NTFS timestamps. Seems to be more reliable when transferring over a network.
/256 Turn off very long path (> 256 characters) support

目标选项

Switch Explanation Default Behavior Equivalent Switch Notes
/A+:[RASHCNET] Set file attribute(s) on destination files + add
/A-:[RASHCNET] Remove file attribute(s) on destination files
/FAT Create destination files using 8.3 FAT file names only
/CREATE Create directory tree structure + zero-length files only
/DST Compensate for one-hour DST time differences

复制选项

Switch Explanation Default Behavior Equivalent Switch Notes
/L List files only Don’t copy, timestamp or delete any files
/MOV Move files Delete from source after copying
/MOVE Move files and directories Delete from source after copying
/sl Copy file symbolic links instead of the target
/Z Copy files in restartable mode Survive a network glitch
/B Copy files in backup mode
/J Copy using unbuffered I/O Recommended for large files
/NOOFFLOAD Copy files without using the Windows copy offload mechanism https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/hh831628(v=ws.11)
/EFSRAW Copy any encrypted files using EFS RAW mode
/TIMFIX Fix file times on all files, even skipped files
/XO Exclude older if destination file exists and is the same date or newer than the source – don’t bother to overwrite it.
/XC Exclude changed files
/XN Exclude newer files
/XX Exclude files present in destination but not source /XX
/XF file [file]… Exclude files matching given names/paths/wildcards
/XD dirs [dirs]… Exclude directories matching given names/paths. /XF and /XD can be used in combination e.g. ROBOCOPY c:\source d:\dest /XF *.doc *.xls /XD c:\unwanted /S
/IA:[RASHCNETO] Include files with any of the given attributes
/XA:[RASHCNETO] Exclude files with any of the given attributes
/IM Overwrite modified files. This includes the same files with different times.
/IS Overwrite files even if they are already the same
/IT Include tweaked files
/XJ Exclude junction points from source /XJ
/XJD Exclude junction points from source directories
/XJF Exclude junction points from source files
/MAX:n Exclude files bigger than n bytes
/MIN:n Exclude files smaller than n bytes
/MAXLAD:n Exclude files unused since n
/MINLAD:n Exclude files used since n If n < 1900 then n = n days, else n = YYYYMMDD date
/MIR Mirror a directory tree /PURGE /E
/PURGE Delete dest files/folders that no longer exist in source
/XL Exclude files present in source but not destination
/SECFIX Robocopy /secfix fixes file security on all files, even skipped files. Specify the type of security information you want to copy by also using one of these options: /COPYALL /COPY:O /COPY:S /COPY:U /SEC
/ZB Use restartable mode; if access denied use Backup mode

监视选项

Switch Explanation Default Behavior Equivalent Switch Notes
/R:n Number of retries on failed copies /R:1000000 Always try to set this option. I recommend setting this to 10-20 to not waste time retrying.
/W:n Wait time between retries /W:30 Always try to set this option to a lower number to retry more quickly. I suggest 5-10.
/REG Save /R:n and /W:n in the Windows registry as default settings
/RH:hhmm-hhmm times when new copies can be started
/TBD Wait for sharenames to be defined retry error 67
/PF Check run hours on a per file (not per pass) basis
/MON:n Run again when more than n changes seen
/MOT:m Run again in m minutes, if changed

了解Robocopy行为

I’ve now completely blew your mind with all of the potential syntax options available to you. Let’s now see all of the different combinations of how we can use this syntax.

I could provide you an enormously long list of robocopy commands with an ever-growing number of switches. But I think it’s better to teach you how to fish. Let’s go over how to put sense out of all of these options.

Robocopy只复制整个目录

每次执行robocopy都会有一个源目录和一个目标目录。Robocopy通过整个目录复制和移动文件。使用robocopy无法显式复制单个文件。可以使用copy或PowerShell的Copy-Item来实现。

然而,您可以通过正确的过滤robocopy单个文件,您将在下面了解到。要使用robocopy复制单个文件,请在源文件名之后立即指定源目录和目标目录。

> robocopy c:\src d:\dst copythisfile.txt

语法取决于环境

此外,您向robocopy提供的选项将取决于环境。在尝试确定要使用哪些选项时,您需要回答一些问题。

  • 您将始终复制到一个空目录吗?
  • 可以文件可能已经存在于目标目录中吗?
  • 您将复制的数据量是几千兆字节还是只是几兆字节?
  • 您是在网络上复制文件还是在本地复制?
  • ……等等。

如果目标文件目录中没有文件,则不必关心覆盖文件的选项。如果您不会在网络上复制文件,则不必担心那些选项。明确定义您当前和潜在未来环境可能出现的情况。

识别默认选项

Robocopy默认使用许多选项。您可以通过查看上面的表格挑选出它们。它还在每次运行实用程序时提供了方便的输出。

您可以看到下面,当我使用其最基本的选项(源和目标文件夹)运行robocopy时,它自动使用了一些选项。了解默认行为很重要。

将输出中看到的选项与上面的选项说明进行对照,您将完全了解robocopy在幕后的操作。

Default robocopy options

了解Robocopy命令的功能

如果您使用过copy或PowerShell的Copy-Item cmdlets,您可能已经指定了源和目标,然后继续了您的工作。在那里您可以配置的选项并不是很多。这些robocopy命令有一个默认行为。

但是另一方面,robocopy了解很多并且让您灵活地调整行为,尽可能满足您的需求。

重要的是要知道,Robocopy 不仅仅意识到文件或目录的概念。文件系统中有比这更多的内容,而 Robocopy 几乎支持所有这些。

A file sitting on a filesystem isn’t just a dumb object with a single purpose. There are many different attributes and things that go with the concept of a file. For example, a file has attributes such as:

  • a timestamp (written, modified and accessed)
  • NTFS ACL
  • 所有者
  • NTFS 审计信息
  • 隐藏标志
  • 归档标志

当您复制或移动文件时,您可以选择是否带上所有这些内容。

要理解的是,当您运行 Robocopy 时,您不仅仅是在复制一个文件,您还可能会复制所有其他相关信息。重要的是要意识到这一点,并在提供给 Robocopy 的选项中加以考虑。

基础知识:执行假设情景

如果您有一个庞大的文件服务器,想要迁移,但暂时不想采取任何行动,您可以使用 Robocopy 返回它将会执行的操作。

使用 /L 选项,您可以告诉 Robocopy 枚举您指定的所有文件和/或文件夹,并返回它将复制/移动的文件列表。

您可以将 /L 选项与任何其他选项一起使用。这是一种查看 Robocopy 将使用的所有选项(默认或非默认)的好方法。它将为您提供您提供给它的选项的整体视图。

Using /L

基础知识:复制文件

Robocopy 最基本的用法是使用源目录和目标目录,没有任何选项。

> robocopy C:\src C:\dst

此选项将从 C:\src 复制所有文件(不包括子文件夹)到 C:\dst

你也可以复制所有文件夹(无论是否为空)和NTFS权限。 换句话说,从我所了解的情况看,这是将关于文件目录的一切内容复制到另一个目录的方法。

下面我正在复制所有NTFS ACL、文件所有者、子文件夹(包括空文件夹)和所有文件属性。所有这些都可以通过使用/E选项来包括所有空子文件夹和/COPYALL来捕获其余内容来实现。

> robocopy C:\src C:\dst /E /COPYALL

基础知识:移动文件

移动文件就像复制一样,将文件从一个目录传输到另一个目录。移动操作的唯一区别在于复制后会删除源文件。

要在复制后从源中删除文件/目录,请使用/MOV选项。这将删除指定目录中的所有文件(不包括子文件夹)。

> robocopy C:\src C:\dst /MOV

您还可以使用/MOVE移动所有文件和子文件夹。

> robocopy C:\src C:\dst /MOVE

基础知识:同步文件

Robocopy允许您同步两个目录。这意味着确保目标目录中的所有文件都在源目录中,而且没有其他文件。 /MIR将复制数据,复制源目录中不在目标中的所有文件并且删除目标中不在源中的文件。注意!

> robocopy C:\src C:\dst /MIR

在网络上复制文件

如果您在网络上复制文件,有一些选项是您应该考虑的。

Robocopy允许您使用/Z选项以“可重启模式”复制文件。这意味着如果文件开始复制然后在中途失败,复制可以重新开始而不是完全失败。当流在网络中断时,/Z选项很有用。

警告:有些人报告使用/Z会导致性能下降四分之一。请告诉我您的发现。

您还可以使用/FFT选项。此开关已知在通过网络传输时更准确地保留文件时间戳。此选项使用FAT文件系统时间戳而不是NTFS。

robocopy C:\src \\SRV1\share /Z /FFT

使用/IPG控制数据包间隔

在通过网络复制文件时,可以使用/IPG开关。这也被称为数据包间隔选项。此选项定义(以毫秒为单位)robocopy在发送新数据包之间等待的频率。

始终使用UNC路径而不是驱动器字母

A reader on Reddit discovered the hard way to not use mapped drives as a destination directory. Instead, always use always use a UNC path. You might run into issues with the 256-character limit if you do. Check out this Microsoft doc for more information.

Robocopy备份模式(Robocopy /Z

Robocopy有一个选项(/B)或作为备份模式(/ZB)的备份,可以复制文件。什么是“备份模式”呢?

通常,当您在Windows中复制文件并遇到需要管理员权限才能访问的文件时,您会收到一个错误,指示您没有权限。即使您以本地管理员身份运行,Windows也不会让您访问它。

警告:有关将数据复制到启用了去重功能的 Windows Server 2016 服务器时出现损坏的服务器卷的报告。当使用/ZB开关时,结果将是对 System Volume Information 中的去重块存储的破坏。复制的文件将无法阅读,并在尝试操作它们时生成错误。有关更多信息的Serverfault链接

备份模式是一种在不担心权限的情况下访问文件的方式。

Robocopy使用备份模式使用SeBackupPrivilege来读取文件,并使用SeRestorePrivilege用户权限来访问所需的任何文件。这将忽略通常会阻止您访问这些文件的任何ACE。

通常将SeBackupPrivilegeSeRestorePrivilege用户权限分配给备份运算符管理员组的用户,但有时它们可能会被删除。备份模块消除了这种风险,并临时授予执行robocopy的用户这些权限。

如果您想检查您的用户帐户是否具有该权限,您可以运行whoami /priv,应显示这两个权限。

过滤文件和文件夹

您可以根据各种标准来排除文件和目录,大多数选项都是为了排除文件和目录的不同方式。我已经列出了基于各种标准对文件和目录进行过滤或排除的所有方法。

按文件名或文件扩展名

通过使用通配符来过滤在robocopy调用中复制/移动的文件。您可以使用通配符来过滤与特定文件名字符串或扩展名匹配的文件。

例如,要仅复制TXT文件,您可以指定*.txt

> robocopy C:\src C:\dst *.txt

如果您想限制仅限以a开头的文件,可以使用a*

> robocopy C:\src C:\dst a*

您还可以通过用空格分隔它们来提供多组文件名匹配,如下所示。

> robocopy C:\src C:\dst a* b*

通过文件名进行过滤时,robocopy将在输出中显示过滤器。

FIltering files output

按目录名

Robocopy允许您不仅按文件名过滤项目,还可以按目录名过滤。使用robocopy /xd,您可以排除与特定名称匹配的某些目录。

在复制多个文件夹时,使用/XD开关来排除运行中的文件夹。

> robocopy C:\src C:\dst /XD "c:\src\exclude"

按文件/目录时间戳

下面是所有基于各种时间戳属性来排除文件和文件夹的robocopy选项。

Switch Explanation
/DCOPY:T Copy directory timestamps
/MAXAGE:n Exclude files older than n days/date
/MINAGE:n Exclude files newer than n days/date
/XO If destination file exists and is the same date or newer than the source, don’t overwrite
/XN If destination file exists and is the same date or older than the source, don’t overwrite

在过滤时间戳等内容时,有两个常用选项:/XO/MAXAGE

/XO允许您仅在它们比源文件新时才排除文件。使用/XO选项,您可以根据访问日期仅复制新文件。

> robocopy C:\src C:\dsc /XO

如果您知道文件的最大年龄,您还可以使用/MAXAGE选项。这允许您以YYYMMDD格式指定文件在复制之前可以具有的旧日期。

> robocopy c:\src c:\dst /S /MAXAGE:20191001

Robocopy作业

您已经看到有数十个选项可供选择。这些选项很容易变得难以处理。幸运的是,您有一个比每次都记住并确保所有这些选项都正确的更好选择。

Robocopy作业文件是包含每行一个选项的文本文件。通常,您将使用robocopy创建这些作业文件。创建后,您可以使用robocopy修改它们或使用简单的文本编辑器。

您有各种与作业一起使用的robocopy命令。

Switch Explanation Default Behavior Equivalent Switch Notes
/JOB:jobname Take parameters from the named job file
/SAVE:jobname Save parameters to the named job file
/QUIT Quit after processing command line Useful for viewing parameters
/NOSD No source directory is specified
/NODD No destination directory is specified
/IF Include the following files

A typical job file created with robocopy has an RCJ extension and looks like the below snippet. This job file was created by running robocopy C:\src D:\dst /save:myjob. You can see that you can provide comments in the job file using :: which is most of what this file has.

没有注释,文件将只包含每行一个选项。

::
:: Robocopy Job C:\MYJOB.RCJ
::
:: Created by Administrator on Sunday, August 18, XXXX at 8:53:24 AM
::

::
:: Source Directory :
::
        /SD:C:\SRC\     :: Source Directory.

::
:: Destination Directory :
::
        /DD:C:\SRC\     :: Destination Directory.

::
:: Include These Files :
::
        /IF             :: Include Files matching these names
::              *.*     :: Include all names (currently - Command Line may override)

::
:: Exclude These Directories :
::
        /XD             :: eXclude Directories matching these names
::                      :: eXclude no names (currently - Command Line may override)

::
:: Exclude These Files :
::
        /XF             :: eXclude Files matching these names
::                      :: eXclude no names (currently - Command Line may override)
::
:: Copy options :
::
        /DCOPY:DA       :: what to COPY for directories (default is /DCOPY:DA).
        /COPY:DAT       :: what to COPY for files (default is /COPY:DAT).
::
:: Retry Options :
::
        /R:1000000      :: number of Retries on failed copies: default 1 million.
        /W:30           :: Wait time between retries: default is 30 seconds.
::
:: Logging Options :
::

保存作业文件

保存作业文件就像在您的语法末尾附加/SAVE:<jobname>选项一样简单。用<jobname>替换作业的名称。/SAVE选项将在运行robocopy的目录中创建一个名为<jobname>.rcj的文件。

> robocopy C:\src C:\dst /SAVE:myjob

必须/SAVE指定为最后一个选项。在/SAVE之后指定的任何选项都不会添加到作业文件中。还请注意,即使已经存在现有的作业文件,robocopy也将始终覆盖现有的文件。备份或版本控制您的作业文件!

注意:如果尝试在保存到作业文件时使用/MT选项,则该选项不会出现在作业文件中。请告诉我是否能够包含此选项。

使用作业文件

一旦作业保存到作业文件中,您就可以使用/JOB:<jobname>选项指定要读取的作业文件。Robocopy会读取作业文件中的所有参数。然后,它会执行,就好像您直接在命令行上提供了选项一样。

> robocopy /JOB:myjob

创建作业文件而不运行作业使用/QUIT

/QUIT选项的目的并不明显。表面上,您可能会认为/QUIT会强制退出运行中的作业。相反,/QUIT更像是一个选项,可以防止作业首先运行。

官方上说,/QUIT选项“强制robocopy终止处理命令行”。但是,更好地解释它是创建一个作业文件而不运行作业。

如果您使用/SAVE选项,它也会自动运行作业。没有办法在首次运行作业之前创建作业文件。您可以使用文本编辑器创建RCJ作业文件,也可以使用robocopy通过在末尾附加/QUIT来创建它。

> robocopy C:\src C:\dst /SAVE:myjob /QUIT

编辑作业文件

由于作业文件只是文本文件,您可以使用您喜欢的文本编辑器编辑它们,或者您可以让robocopy为您完成。

您可以使用/JOB/SAVE/QUIT的组合来编辑作业文件。

例如,也许您想从名为backupfiles.rcj的作业文件中排除所有EXE文件。您已经创建了作业文件,不想覆盖整个内容。您可以像下面这样添加新选项:

> robocopy /JOB:backupfiles /XF *.EXE /SAVE:backupfiles /QUIT

使用多个作业文件

您甚至可以组合使用多个作业文件。在同一次运行中指定多个作业文件时,该运行中使用的所有选项将被合并在一起。

例如,也许您有一个大型文件排除列表要从您的备份文件复制作业中排除。打开文本编辑器,添加以下内容以创建一个exclude.rcj文件。

/XF
    a.exe
    b.txt
    c.cer

然后,您可以像这样从备份文件作业中排除这些文件:

> robocopy /JOB:backupfiles /JOB:exclude

由于原始备份文件作业文件已经排除了所有EXE文件,上述运行的语法看起来会是/XF *.exe a.exe b.txt c.cer。Robocopy将所有选项合并为一个。

Robocopy模板和使用/NOSD/NODD选项

如果您正在处理大量作业文件,您可以构建接受参数的作业文件。Robocopy允许您在运行作业时从命令行传递值。参数不是robocopy术语,但在这种情况下很合适。

您可以通过不明确指定源目录或目标目录来构建接受参数的robocopy作业,要么显式地使用/NOSD/NODD选项,要么根本不包括源和目标目录。

举个简单的例子,使用以下语法创建一个没有源或目标的作业文件。该作业的意图是从源目录复制所有TXT和EXE文件到目标目录。

> robocopy *.txt *.exe /SAVE:backupfiles /QUIT

单独使用时,该作业永远不会工作,因为没有指定源或目标目录。

当您创建一个没有源和目标目录的作业时,作业文件将使用/NOSD/NODD选项自动创建。

/NOSD           
/NODD
/IF
    *.txt
    *.exe
/DCOPY:DA
/COPY:DAT
/R:1000000
/W:30

/NOSD选项告诉robocopy您没有包含源目录,而/NODD表示您没有包含目标目录。这个作业文件是其他作业的“模板”。

但是,您可以向此作业文件传递“参数”以提供源和目标目录。

要使用刚创建的作业文件从C:\src复制文件到C:\dst,您可以直接在命令行中传递这些目录,然后这些目录将传递给作业。

> robocopy /JOB:backupfiles C:\src C:\dst

异步复制(Robocopy /MT

默认情况下,robocopy一次只处理一个文件。但是,您可以使用/MT选项强制robocopy一次复制多个文件。

/MT选项允许您指定robocopy用于复制文件的线程数。最大值为128。

您可以这样使用/MT

> robocopy C:\src C:\dst /MT:32

I’ve chosen 32 in this case as a baseline. I suggest starting at 32 to see how your computer and network handle things and adjust the threads accordingly.

请注意,如果您使用/MT,则将无法使用/IPG/EFSRAW。为了获得更好的性能,请不要将日志输出到控制台。而是使用/LOG

调度Robocopy

Robocopy有几种可以安排其运行时间的方式。

使用/RH

使用 /RH 选项,您可以告诉 robocopy 只在特定时间运行。如果您有一个维护窗口或者所有人都已下班的时间,这将非常有用。

您可以以 HHMM-HHMM 的格式指定开始时间和结束时间。例如,要调用 robocopy,但只允许其在系统时钟定义的下午 5 点到上午 9 点之间运行,请运行:

> robocopy C:\src C:\dst /RH:1700-0900

您会注意到,如果在这些时间之外调用 robocopy,它将告诉您当前时间并等待开始时间运行。

Robocopy tells you what time it will start if scheduled

您必须确保两个时间都以 24 小时制格式,并且长度正好为四位数字。窗口时间必须大于两分钟。

默认情况下,使用 /RH 将在整个运行之前检查开始时间。然而,如果您有大量文件并且认为该过程可能会超过该时间,您可以使用 /PF 选项。 /PF 将强制 robocopy 在每个文件之前检查时间窗口。

使用任务计划程序

输出日志

Robocopy 将始终返回一个输出日志。无论该日志是通过标准输出显示在控制台上还是重定向到日志文件中,都取决于您。

在显示 robocopy 输出时,您有很多选项。

Switch Explanation Default Behavior Equivalent Switch Notes
/NP No progress. Suppresses the display of progress information. This can be useful when output is redirected to a file.
/unicode Display the status output as unicode text
/LOG:file Output status to log file and overwrite
/UNILOG:file Output status to unicode log file and overwrite
/LOG+:file Output status to log file and append to existing log file
/UNILOG+:file Output status to unicode log file and append to existing log file
/TS Displays the file timestamps for every file processed.
/FP Replaces simple file names with full file pathnames in the output.
/NS Does not show file sizes.
/NC Hides output the file class “Text Tags” (Go here for more information: https://www.uvm.edu/~gcd/2015/04/robocopy-file-classes/)
/NFL Hides file names. Failures are still logged though. Any files files deleted or would be deleted if /L was omitted are always logged
/NDL Hides output of the directory listing. Full file pathnames are output to more easily track down problematic files.
/TEE Output to console window, as well as the log file
/NJH No job header
/NJS No job summary
/BYTES Print sizes as bytes
/X Report all files, not just those selected & copied
/V Produce verbose output log, showing skipped files
/ETA Show estimated time of arrival of copied files. See the start time of each file copy and the estimated time of completion based on the observed throughput of previous copies. Times are displayed after the file name in the format HH:MM – > HH:MM (start – > finish).
/DEBUG Show debug volume information

使用 /NJS/NJH 限制日志元素

默认情况下,robocopy 返回两个元素作为输出,即作业标题和作业摘要。

作业标题就是顶部的简单 ROBOCOPY 标题。

Robocopy job header

工作摘要显示所有文件/文件夹的摘要状态,传输了多少数据以及运行结束的时间。

Robocopy job summary

您可以使用/NJH选项隐藏这些元素中的每一个,以隐藏作业标题,并使用/NJS选项隐藏作业摘要。您可以包含这些选项中的任何一个或两者一起。

Hiding the job header and job summary

将输出日志重定向到文件

如果您需要保存输出日志,可以将其重定向到文本文件和/或在控制台上显示。您可以使用传统的输出重定向器,如>>>,PowerShell或/LOG选项来执行此操作。

要将输出日志重定向到文件并覆盖任何现有日志文件,请使用以下语法/LOG:<filepath>,如下所示。您在控制台上接收到的唯一输出是日志文件的路径。

> robocopy C:\src C:\dst /LOG:c:\file.log

 Log File : c:\file.log

如果您想保留任何现有日志文件的内容并将结果追加到文件中,可以使用+操作符,如下所示。

> robocopy C:\src C:\dst /LOG+:c:\file.log

 Log File : c:\file.log

将输出日志重定向到文件并显示在控制台上

如果您想将输出日志保存到文件中,同时也在控制台上查看它,可以使用/TEE选项。此选项使robocopy将输出写入日志文件,同时仍保持将输出返回到控制台的默认行为。

robocopy C:\src C:\dst /LOG+:c:\file.log /TEE

退出代码

与所有其他命令行实用程序一样,robocopy根据执行结果返回退出代码。我们都希望robocopy始终以0成功退出,但情况并非总是如此。

以下是robocopy返回的所有退出代码及其解释。任何大于七的退出代码都表示执行过程中至少发生了一个失败。

Exit Code Explanation
0 No action performed. Source and destination are synchronized.
1 At least one file was copied successfully.
2 Extra files or directories were detected. Examine log.
3 Exit codes 2 and 1 combined.
4 Mismatched files or directories found. Examine log.
5 Exit codes 4 and 1 combined.
6 Exit codes 4 and 2 combined.
7 Exit codes 4, 1 and 2 combined.
8 At least one file or directory could not be copied. Retry limit exceeeded. Examine log.
16 Copy failed catastrophically.

请注意,如果您在第三方实用程序中执行robocopy,则该实用程序可能认为任何非零退出代码都是失败。为了防止这种情况发生,如果返回1,您可以将退出代码更改为0。

Robocopy的“extra”文件退出代码是一个常见的返回代码,意味着目标文件夹中有一个“extra”文件,但源文件夹中没有。该代码排除了会阻止从目标文件夹删除任何文件的额外文件。

在批处理文件中更改退出代码

如果您使用批处理文件执行robocopy,则可以查找%ERRORLEVEL%变量的值。如果返回1,则使用exit关键字以退出带有0的脚本。

> (robocopy <options>) ^& IF %ERRORLEVEL% LEQ 1 exit 0

在PowerShell脚本中更改退出代码

如果您在PowerShell脚本中执行robocopy,则可以使用Start-Process调用robocopy,使用PassThru返回创建的进程,并使用Wait等待robocopy完成。然后,您可以检查ExitCode属性是否为1。如果退出代码为1,则使用$host.SetShouldExit()退出带有0的PowerShell脚本。

$exitCode = (Start-Process -FilePath 'robocopy' -ArgumentList '<option>' -PassThru -Wait).ExitCode
if ($exitCode -eq 1) {
    $host.SetShouldExit(0)
}

常见错误

如果您处理成千上万个文件,您肯定会遇到一些问题。以下是我遇到的常见错误的详细说明

错误:无效的参数

当您看到一个错误提示 错误无效的参数 时,通常意味着您尝试以某种方式将选项传递给 robocopy 时出现了顺序错误。错误 robocopy 无效的参数 3 是最常见的,似乎是如此。

A common reason you’d receive this error is when you specify a source or destination directory with spaces and forget to surround it with quotes.

Robocopy 示例

您可以构建自己的 robocopy 字符串,或者您可以借鉴他人的经验并使用它们!在本节中,我将介绍如何使用 robocopy 完成各种任务的用例。

查找网络文件夹的目录大小

贡献者:northendtroooper(Reddit)

> robocopy "\\MACHINE\fileshare" c:\dummy /l /xj /e /nfl /ndl /njh /r:0 /mt:64

快速删除文件夹内容(忽略子文件夹的权限)

贡献者:pizzasteveo(Reddit)

> robocopy c:\dummy c:\foldertodelete /MIR

执行大文件迁移

贡献者:@MySnozzberries(Twitter)

此代码片段的目标是强制将所有文件的所有权归还给管理员。然后,我们为 Administrators 组添加了一个显式的 ACE,以便在每个对象上递归地获得完全控制权限,即使我们也在设置继承。

最后,我们使用 DACLs 进行完整的 robocopy 复制到目标位置并记录日志。日志随后可用于查看其他权限问题或仅文件锁定,并且稍后可以执行另一个增量同步。

> takeown /F .\test /R /A /D Y
> icacls .\test /grant "Administrators":(OI)(CI)F /T
> robocopy .\test .\test2 /E /SEC /FP /V /LOG:.\temp.log

递归地将 Administrators 组强制设定为所有文件和目录的所有者。虽然有绕过此设置的方法,但这是最直接的方法,通常也是最快的。

> takeown /F .\test /R /A /D Y

一旦我们成为所有者,现在就可以强制将新的 ACE 强加到每个对象的 DACL 中。这将授予 Administrators 完全控制权,并启用继承,且递归地应用到路径中。

在根目录设置这一权限并启用继承将覆盖整个环境,但当共享设置为具有 CREATOR OWNER 权限的 完全控制(遗憾的是,这甚至是 Microsoft 对文件用户配置文件存储等内容的建议),用户可以自行禁用继承或移除 ACE。因此,采取直接措施通常是最快的修复方法。

> icacls .\test /grant "Administrators":(OI)(CI)F /T

一旦我们已经更改了大部分文件的 DACL,我们尝试将文件复制到新位置,这在文件共享迁移等情况下很常见。为此,我们递归地复制项目,并使用 /SEC 开关来同时复制数据/属性/时间戳/DACL。

然后,我们记录操作的完整路径和所有对象(/V 详细开关)到日志中,以便我们可以处理通常是路径长度或文件锁相关的不到 5% 的错误,并进行更详细的操作。

> robocopy .\test .\test2 /E /SEC /FP /V /LOG:.\temp.log

这是管理文件共享迁移的简单框架,对用户体验的影响最小。这也提高了 IT 对数据的控制。如果客户在子文件夹级别上正确管理所有权,具有强大的数据治理实践,那么情况会更加复杂,但我们发现大多数客户幸运的是只使用继承和基于组的 ACE,因此这是我们通常开始解决的最常见情况和方法。

Robocopy替代方案

Robocopy是一个很棒的工具,但有很多其他类似的工具可能也会引起兴趣。

  • xxcopy – 一个类似的命令行实用程序,拥有大量选项。
  • Copy-Item PowerShell cmdlet – 功能远不及Robocopy丰富,但简单得多。
  • TreeSize – GUI和可脚本化的工具,用于查找文件夹信息。

总结

Robocopy是一个用于复制大量文件集的优秀工具。无论您是在进行数据迁移,保持文件夹同步还是仅需要一种快速准确地复制文件的方法,Robocopy都是一个很好的选择。

Source:
https://adamtheautomator.com/robocopy/