網頁

使用Robocopy.exe成為檔案備份大師

使用Robocopy.exe成為檔案備份大師

Robocopy 是 Robust File Copy for Windows 的簡稱。它是一支 Windows 系統內建檔案複製、同步、搬移指令,它利用多執行緒來提高複製效能,但在高效的背後資源使用率確出奇的低。另一重點是,它提供了非常多元參數,讓管理者能非常靈活的組合出想要所需複製的檔案與行為,複製、同步、差異、鏡像都不是問題,排程、監視也有內建功能,功能之強大,我覺得完全不輸商用軟體,更重要的它是 Windows 內建也就沒有商用授權問題。但官方說明文件會讓你不知如何下手,此篇讓我們用大量範例來說明每個參數用法,教大家成為備份大師。

robocopy.exe 位於 C:\Windows\System32 之下,語法:

robocopy.exe source destination [file [file]...] [options]
  • sourcedestination 目錄都同時支援 drive:\path\\server\share\path 格式。
  • file 指定要複製的檔案。可使用 ?* 符號,未指定 file 選項,預設 *.*,可指定多組設定。
  • option 是此指令核心,robocopy.exe 提供非常多元參數可選擇使用。

本篇裡的 option 不分大小寫。

# 採用預設值進行複製
robocopy.exe \\Srv1\reports \\Srv2\backup
# 複製副檔名 .jpg 與 .bmp 檔案
robocopy.exe \\Srv1\reports \\Srv2\backup *.jpg *.bmp
# 可以把 * 與 ? 當成超簡易 regex 來使用
robocopy.exe \\Srv1\reports \\Srv2\backup *-test.log

複製 copy option 選項

  • /S:複製子目錄,但是空的子目錄例外。
  • /E:複製子目錄,包括空的子目錄。
  • /LEV:n:只複製來源目錄的前 n 層。
  • /J:使用無緩衝的 I/O 複製 (建議使用於大型檔案)。
# 複製副檔名 .xml 檔案,含空子目錄。
robocopy.exe \\Srv1\reports D:\backup *.xml /E
# 複製副檔名 .xml 檔案,含空子目錄,但目錄最多處理前兩層。
robocopy.exe \\Srv1\reports D:\backup *.xml /E /lev:2

  • /COPY:copyflag[s]:要為檔案複製什麼內容(預設值/COPY:DAT)。
    • 複製旗標:D=資料A=屬性T=時間戳記、S=安全性=NTFS ACL、O=擁有者資訊、U=稽核資訊
    • /SEC:複製包含安全性的檔案 (相當於 /COPY:DATS)。
    • /COPYALL:複製所有檔案資訊 (相當於 /COPY:DATSOU)。
    • /NOCOPY:不複製檔案資訊 (可用於 /PURGE)。
  • /PURGE:刪除來源已經不存在的目的地檔案/目錄。
  • /MIR:鏡像樹狀目錄 (相當於 /E/PURGE)。

/MIR 等於是把 source 的狀態完全反應至 destination,也就是,把 source 的任何異動狀態完全反應至 destination,如同鏡子一樣。

# 想成在 source 按 Ctrl+C,在 destination 按 Ctrl+V
robocopy.exe \\Srv1\reports \\Srv2\backup /MIR

/e /purge/mir 有些許的差異:

  • 使用 /e/purge 選項,如果目的地目錄已存在,目的地目錄的安全性設置不會被覆寫。
  • 使用 /mir 選項,如果目的地目錄已存在,目的地目錄的安全性設置會被覆寫。

  • /MOV:移動檔案 (複製後從來源刪除)。
  • /MOVE:移動檔案和目錄 (複製後從來源刪除)。
# 將 source 結構完整移動至 destination
# 想成在 source 按 Ctrl+X,在 destination 按 Ctrl+V
robocopy.exe \\Srv1\reports \\Srv2\backup /MOVE /E
  • /MON:n:監視來源; 看到 n 個變更以上時再次執行。
  • /MOT:m:監視來源; m 分鐘後如果變更,則再次執行。
# 每 1 分鐘監測來源是否有異動,有則複製。
robocopy.exe \\Srv1\reports \\Srv2\backup /E /MOT:1
# 每 1 分鐘監測來源是否有 3 異動,有則複製。
robocopy.exe \\Srv1\reports \\Srv2\backup /E /MON:3

/MON:n 本身帶有 /MOT:1 的效果,而那異動的計算相當細緻,我測了好多次才了解它的行為,舉個簡單例子,我開啟 source 一個純文檔,輸入一個 test 單字,然後存檔。test 四個字元是 4 個異動,存檔是 1 個異動,以上行為會造成 5 個異動。

  • /RH:hhmm-hhmm:執行時數 - 新複本可以開始的時間。
# 在指定時間進行複製作業
robocopy.exe \\Srv1\reports \\Srv2\backup /RH:1100-1300

/MON/MOT/RH 等都會造成執行視窗(執行緒)鎖定的問題。比較好的方式是配合工作排程器定時執行 robocopy.exe。


  • /IPG:n:慢速線路可用頻寬,封包之間的差距 (毫秒)。
  • /MT[:n]:以 n 個執行緒執行多執行緒複製 (預設值為 8)。n 必須至少為 1,但不可以大於 128。此選項與 /IPG/EFSRAW 選項不相容。使用 /LOG 選項重新導向輸出,以獲得更好的效能。
  • /DCOPY:copyflag[s]:對於目錄,要複製哪些項目 (預設值/DCOPY:DA)。
    • 複製旗標: D=資料A=屬性、T=時間戳記
  • /NODCOPY:不複製目錄資訊 (預設會執行 /DCOPY:DA)。
  • /NOOFFLOAD:複製檔案 (不使用「Windows 複本卸載」機制)。

如果你的 CPU 夠力 /MT[:n] 是個改善效能不錯的下手點。另外要注意 source 是否受得了你的多執行緒複製。

# 使用 32 執行緒來進行作業
robocopy.exe \\Srv1\reports \\Srv2\backup /MT:32
# 依經驗,IPG:750 約使用 1 MB 頻寬
robocopy.exe \\Srv1\reports \\Srv2\backup /IPG:750 /R:3 /W:3

檔案 file selection option 選項

  • /IA:[RASHCNETO]:只包含附帶任何指定屬性的檔案。
  • /XA:[RASHCNETO]:排除附帶任何指定屬性的檔案。
# 排除隱藏文件
robocopy.exe \\Srv1\reports \\Srv2\backup /E /XA:H

參考 [RASHCNETO]

  • R – Read only
  • A – Archive
  • S – System
  • H – Hidden
  • C – Compressed
  • N – Not content indexed
  • E – Encrypted
  • T – Temporary
  • O - Offline

  • /XF file [file]...:排除符合指定名稱/路徑/萬用字元的檔案。
  • /XD dirs [dirs]...:排除符合指定名稱/路徑的目錄。
# 排除副檔名 .tmp, .bak 檔案
robocopy.exe \\Srv1\reports \\Srv2\backup /XF *.tmp *.bak
# 排除特定目錄
robocopy.exe \\Srv1\reports \\Srv2\backup /XD "C:\Temp"
# 複製整顆硬碟,把圾垃筒之類給排除
robocopy.exe D:\ E:\ *.* /E /XD "$RECYCLE.BIN" "System Volume Information" "RECYCLER"

  • /XC:排除變更的檔案。
  • /XN:排除較新的檔案。
  • /XO:排除較舊的檔案。
  • /XX:排除其他檔案和目錄。
  • /XL:排除孤立的檔案和目錄。
  • /IS:包含相同的檔案。
  • /IT:包含調整的檔案。
# source 沒有比 destination 新時,不複製。這等於進行差異化備份
robocopy.exe \\Srv1\reports \\Srv2\backup /E /XO /PURGE
# source 要比 destination 新,且不複製隱藏與系統檔案。
robocopy.exe \\Srv1\reports \\Srv2\backup /E /XO /XA:SH /PURGE
# 僅複製權限變更(新增或移除)的檔案,前提是已含有資料的副本
robocopy.exe \\Srv1\reports \\Srv2\backup /E /Copy:S /IS /IT

  • /MAX:n:檔案大小上限 - 排除大於 n 個位元組的檔案。
  • /MIN:n:檔案大小下限 - 排除小於 n 個位元組的檔案。
  • /MAXAGE:n:檔案期限上限 - 排除 n 日/日期之前的檔案。
  • /MINAGE:n:檔案期限下限 - 排除 n 日/日期之後的檔案。
  • /MAXLAD:n:上次存取日期上限 -排除自 n 日後未使用的檔案。
  • /MINLAD:n:上次存取日期下限 - 排除自 n 日後使用的檔案。

如果 n < 1900 則 n = n 日,否則 n = YYYYMMDD 日期。

# 排除 source 大於 1000000 bytes(1000 KB) 的檔案
robocopy.exe \\Srv1\reports \\Srv2\backup /MAX:1000000
# 列出大於 32 MBytes 的檔案清單
robocopy.exe \\Srv1\reports \\Srv2\backup /MAX:33554432 /L
# 複製最近 7 天的檔案
robocopy.exe \\Srv1\reports \\Srv2\backup /E /MAXAGE:7
# 複製指定日期之後的檔案
robocopy.exe \\Srv1\reports \\Srv2\backup /E /MAXAGE:20190410
# 移動超過 7 天的檔案與目錄(含空目錄)
robocopy.exe \\Srv1\reports \\Srv2\backup /E /MOVE /MINAGE:7

重試 retry option 選項

  • /R:n:失敗複本的重試次數: 預設值是 1000000 次。
  • /W:n:重試之間等候時間: 預設值是 30 秒。

注意這兩個值可能影響效能,也就是「1百萬次x30秒」是個使命必達的預設參數值,沒完成絕不罷休概念。如果同一工作,排程執行很久但手動執行很快,那麼或許是這裡預設值造成的,是可以下手測試的一個點。

記錄 logging 選項

  • /L:限清單 - 不複製、刪除任何檔案或加上戳記。
  • /X:報告所有其他檔案,不僅是這些選取的檔案而已。
  • /V:產生詳細資訊輸出,顯示略過的檔案。
# 顯示結果清單,但不進行實際複製或移動。
# /L 在測試階段非常好用。
robocopy.exe \\Srv1\reports \\Srv2\backup /E /MAXAGE:2 /L
  • /NS:沒有大小 - 不記錄檔案大小。
  • /NC:沒有類別 - 不記錄檔案類型。
  • /NFL:沒有檔案清單 - 不記錄檔案名稱。
  • /NDL:沒有目錄清單 - 不記錄目錄名稱。
# 輸出不含檔案與目錄相關資訊
robocopy.exe \\Srv1\reports \\Srv2\backup /E /NS /NC /NFL /NDL
  • /NJH:沒有工作標頭。
  • /NJS:沒有工作摘要。

/NJH 想成 Table Header、/NJS 想成 Table Footer,其他想成 Table Body 的細項。

# 無訊息輸出
robocopy.exe \\Srv1\reports \\Srv2\backup /E /NS /NC /NFL /NDL /NJH /NJS

上面這個範例,如果加上後面介紹的 /LOG 參數,那麼會得到空白的日誌檔。

  • /NP:無進度 - 不顯示複製百分比。
  • /ETA:顯示複製的檔案預估到達時間。
  • /UNICODE:輸出狀態為 UNICODE。

/UNICODE 我在英文版作業系統使用反而得到一堆亂碼。

  • /LOG:file:輸出狀態至記錄檔 (覆寫現有的記錄檔)。
  • /LOG+:file:輸出狀態至記錄檔 (附加至現有的記錄檔)。
  • /UNILOG:file:輸出狀態至記錄檔,變成 UNICODE (覆寫現有的記錄檔)。
  • /UNILOG+:file:輸出狀態至記錄檔,變成 UNICODE (附加至現有的記錄檔)。
  • /TEE:輸出至主控台視窗,以及記錄檔。
# 同時輸出日誌至 c:\robolog.txt 與主控台視窗
robocopy.exe \\Srv1\reports \\Srv2\backup /J /tee /LOG+:"c:\robolog.txt" /ETA /BYTES
  • 注意,測試過程發現,日誌直接輸出在磁碟根目錄會出錯。
  • 輸出至主控台視窗會會影響效能,建議正式作業輸出至 /LOG/LOG+

Job option 選項

  • /JOB:jobname:從命名的工作檔案取得參數。
  • /SAVE:jobname:將參數儲存至命名的工作檔案。
  • /IF:包含以下檔案。
# 將 robocopy 執行參數輸出至 JobName.RCJ
robocopy.exe D:\SyncSource E:\SyncDestination /E /SAVE:JobName

預設副檔名 .RCJ。上面為例,輸出以下內容:


::
:: Robocopy Job C:\USERS\Bruce\JobName.RCJ
::
:: Created by Bruce on 2019年4月12日 at 下午 01:11:49
::

::
:: Source Directory :
::
	/SD:D:\SyncSource\	:: Source Directory.

::
:: Destination Directory :
::
	/DD:E:\SyncDestination\	:: 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 :
::
	/S		:: copy Subdirectories, but not empty ones.
	/E		:: copy subdirectories, including Empty ones.
	/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 :
::

有了 JobName.RCJ 後就能讀入(重覆)使用:

# 由 JobName 讀入所需參數並執行
robocopy.exe /JOB:JobName

/JOB:JobNameJobName 可用 "Drive:\Path" 指定 .RCJ 位置。這樣我們就能把需要的備份工作類型一一儲存為 .RCJ 來分類整理,需要調整參數時也只需要去修改 .RCJ 檔即可。而 /IF 的用法與一開始語法的 file 一樣,指定想要的檔案類型,未指定為 *.*。

Robocopy 效能測試

robocopy.exe D:\SyncSource E:\SyncDestination *.* /S /XO /LOG:"E:\SyncDestination\robo.txt" /MAXAGE:1

Source 是區網的另一台主機,約 450 GB 資料,約 20 萬個目錄 50 萬個檔案,我要複製近 2 天不含空白資料夾的資料,並且 Source 要比 Destination 還新才進行複製(差異備份)。

  • 4 vCore 2400 MHz: 5% ~ 8% 使用率
  • 8 GB Memory: 1.5 ~ 2 MB 使用率

第一次比對與複製,因為含複製 5.5 GB 檔案,時間比較久一些:

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows                              
-------------------------------------------------------------------------------

  Started : 2019年4月12日 下午 02:48:28
   Source : H:\
     Dest : E:\SyncDestination\Before\

    Files : *.*
	    
  Options : *.* /S /DCOPY:DA /COPY:DAT /XO /MAXAGE:1 /R:1000000 /W:30 

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :    188364    188363         1         0         0         0
   Files :    492852      4994    487858         0         0         0
   Bytes : 454.741 g   5.291 g 449.450 g         0         0         0
   Times :   0:16:35   0:09:12                       0:00:00   0:07:23


   Speed :            10276438 Bytes/sec.
   Speed :             588.022 MegaBytes/min.
   Ended : 2019年4月12日 下午 03:05:04

第二次只進行差異比對,速度就快很多了:

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows                              
-------------------------------------------------------------------------------

  Started : 2019年4月12日 下午 03:06:17
   Source : H:\
     Dest : E:\SyncDestination\Before\

    Files : *.*
	    
  Options : *.* /S /DCOPY:DA /COPY:DAT /XO /MAXAGE:1 /R:1000000 /W:30 

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :    188364    186341      2023         0         0         0
   Files :    492852         0    492852         0         0         0
   Bytes : 454.741 g         0 454.741 g         0         0         0
   Times :   0:06:39   0:00:00                       0:00:00   0:06:39
   Ended : 2019年4月12日 下午 03:12:57

近 20 萬個目錄 50 萬個檔案,不論 CPU 或 Memory 的資源使用率表現可圈可點,尤其是 Memory 的值,低到讓人嚇到吃手手,不敢相信在 21 世紀還有這樣低成本的應用程式。

小結

  • 本篇列出是我個人覺得重要或有在使用的情境,並非全部參數(包含 80% 以上),完整說明可參考官方 robocopy command 文件。
  • 說個從 Wiki 看到的小故事,Robocopy 首次在 1996 年 Windows NT 4.0 出現,已存在超過 20 年(還有在進版)。而我第一次接觸與介紹是在 2011 年 Windows 7 系統, robocopy.exe 薑是老的辣。
  • robocopy.exe 在後續 Microsoft Azure 也提供重要的基礎,如果你用過 azcopy.exe 就會處處看到 robocopy.exe 的影子。

1 則留言:

  1. 請教一個問題,你的LOG輸出排列得很整齊。不知道你的作業系統環境是什麼?
    我的語法是robocopy \\來源 F:\目的 /e /dcopy:t /xo /R:10 /MT:100 /LOG+:F:\%NAS_name%\%log_name%.txt
    這樣跑出來的結果Total Copied Skipped Mismatch FAILED Extras 數字會往左邊跑,沒辦法像你一樣對齊

    回覆刪除

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。