使用Robocopy.exe成為檔案備份大師
Robocopy 是 Robust File Copy for Windows 的簡稱。它是一支 Windows 系統內建的檔案複製、同步、搬移指令,它利用多執行緒來提高複製效能,但在高效的背後資源使用率確出奇的低。另一重點是,它提供了非常多元參數,讓管理者能非常靈活的組合出想要所需複製的檔案與行為,複製、同步、差異、鏡像都不是問題,排程、監視也有內建功能,功能之強大,我覺得完全不輸商用軟體,更重要的它是 Windows 內建也就沒有商用授權問題。但官方說明文件會讓你不知如何下手,此篇讓我們用大量範例來說明每個參數用法,教大家成為備份大師。
robocopy.exe 位於 C:\Windows\System32 之下,語法:
robocopy.exe source destination [file [file]...] [options]
source
與destination
目錄都同時支援 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:JobName
的 JobName
可用 "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 的影子。
請教一個問題,你的LOG輸出排列得很整齊。不知道你的作業系統環境是什麼?
回覆刪除我的語法是robocopy \\來源 F:\目的 /e /dcopy:t /xo /R:10 /MT:100 /LOG+:F:\%NAS_name%\%log_name%.txt
這樣跑出來的結果Total Copied Skipped Mismatch FAILED Extras 數字會往左邊跑,沒辦法像你一樣對齊