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的选项将取决于环境。在尝试确定要使用哪些选项时,您需要回答一些问题。

  • 您是否总是要复制到一个空目录中?
  • 在目標目錄中可能已經存在檔案嗎?
  • 您將複製的是幾TB的數據還是僅僅幾MB的數據?
  • 您將在網絡上還是本地進行文件複製?
  • ……等等。

如果目標文件目錄中沒有文件,您就不需要擔心覆蓋文件的選項。如果您不會在網絡上複製文件,就不需要擔心那些選項。明確定義您當前和潛在的未來環境將處於的情況。

了解預設選項

Robocopy默認使用很多選項。您可以通過查看上面的表格來選擇它們。每次運行該實用程序時,它還會提供一個方便的輸出。

您可以看到,當我使用最基本的選項(源文件夾和目標文件夾)運行robocopy時,它會自動使用一些選項。了解默認行為很重要。

通過參考輸出中看到的選項與上面的選項解釋,您將完全了解robocopy在底層的操作。

Default robocopy options

了解Robocopy命令的功能

如果您使用過copy或PowerShell的Copy-Item cmdlet,您可能會指定源和目標,然後繼續進行日常工作。在那裡,您可以配置的選項並不多。這些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将要使用的所有选项(默认或非默认)。它将为您提供一个总体视图,了解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會導致性能下降1/4。請告訴我您的發現。

您還可以使用/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開關時,將破壞去重塊存儲在系統卷信息中。複製的文件將無法讀取,嘗試操作這些文件時會生成錯誤。進一步信息請參考 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: 選項來指定要讀取的工作檔案。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

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

> robocopy /JOB:backupfiles /JOB:exclude

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

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

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

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

举个简单的例子,创建一个没有指定源或目标的作业文件,使用以下语法。此作业的目的是从源目录复制所有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始終會返回輸出日誌。該日誌是通過stdout在控制台上顯示和/或重定向到日誌文件取決於您。

顯示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選項將輸出日誌重定向到文件,覆蓋任何現有的日誌文件,請使用以下語法/LOG:<檔案路徑>,如下所示。您只會在控制台上收到指向日誌文件的路徑的輸出。

> 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的“额外”文件退出代码是常见的返回代码,表示目标文件夹中存在一个“额外”文件,但源文件夹中不存在。此代码排除了会阻止从目标中删除的额外文件。

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

如果您在批处理文件中执行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。然後,我們為 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 – 一個帶有圖形界面和腳本功能的工具,用於查找文件夾信息。

總結

Robocopy是一個優秀的工具,用於複製大量文件。無論您是進行數據遷移,保持文件夾同步還是只需要快速準確地複製文件,Robocopy都是一個很好的選擇。

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