【程式開發筆記】讓電腦定時幫你備份重要資料,「鏡像同步、差異備份」樣樣通,Robocopy - 大漠國渡

前言

大漠開始寫部落格,並拍照紀錄旅遊,就碰上了「照片備份」的問題,於是上網找了開始方法,並免自己一直手動複製資料浪費時間。

看了其他攝影師的方法就是「硬碟外接盒」做「磁碟陣列 RAID 1」 或是「NAS」做「磁碟陣列 RAID 6」的熱備份,而「熱備份」比較消耗硬碟的壽命,結論就是有點燒錢啊 😖

後來發現了 Window 的 Robocopy 也有辦法做「鏡像同步」、「差異備份」,重點是可以「冷備份」延長硬碟的壽命,而且可以也跟「RAID 6」有效率的使用硬碟空間,不會因為「 RAID 1」要備份,有一半的空間無法使用的缺點 😀

那接下來的內容就是範例實作排程設定,還有分享一下大漠幫 Robocopy 寫了一個 UI 介面 (使用者介面),方便自己操作的範例 😎

最後是一些 Robocopy 在「鏡像同步」使用到的參數的說明 😊 

一、使用 Robocopy 進行「資料夾」鏡像同步

(一)、範例

先開啟「記事本」。

Robocopy - 鏡像同步、差異備份

輸入「Robocopy <你的來源資料夾> <你的目的地資料夾> /mir /xo /e」。

上面是最簡易的指令,習慣操作之後,建議參考「進階指令」和「最終指令」做更詳細的設定 (後頭提供)。

範例  : Robocopy D:\TEST D:\TEST2 /mir /xo /e。

Robocopy - 鏡像同步、差異備份

接下來將檔案儲存程「Windows 批次檔案 (.bat)」,「檔名」跟「路徑」就自己決定吧 😁

Robocopy - 鏡像同步、差異備份

測試範例 :「TEST」資料夾有 7 個檔案,而「TEST2」資料夾沒有檔案。

Robocopy - 鏡像同步、差異備份

可以直接滑鼠雙擊剛剛所建立的「Windows 批次檔案 (.bat)」,執行 Robocopy 進行「鏡像同步 (差異備份)」。

但是大漠想要看 Log,所以就使用「終端機」執行 😋

Robocopy - 鏡像同步、差異備份

先到「Windows 批次檔案 (.bat)」,並輸入批次檔案名稱)」,執行 Robocopy 進行「鏡像同步 (差異備份)」。

不會操作「終端機」也沒關西,待會的 「進階指令」會教如何將 Log 輸出成檔案,如不想看 Log 就不要理會這段啦 😆

Robocopy - 鏡像同步、差異備份

下圖是執行 Robocopy 的結果 (Log)。

Robocopy - 鏡像同步、差異備份

確定「TEST」資料夾下的 7 個檔案,都複製到「TEST2」資料夾下了 😁

Robocopy - 鏡像同步、差異備份

(二)、電腦自動執行「鏡像同步」(設定排程)

再來就使用 Windows 內建的「工作排程器」設定排程,來模擬「雲端硬碟」的同步 ,但是沒有即時同步的功能,最少會有 5 分鐘的時間差 😋

Robocopy - 鏡像同步、差異備份

先建立新的「排程工作」。

Robocopy - 鏡像同步、差異備份

先幫自己的排程命名 ~ (自己取名)

再來最重要的選項「不論使用者登入與否均執行」、「不要儲存密碼」、「以最高權限執行」和「隱藏」都要勾選,不然每次執行排程時,都會有效視窗跑出來吵你 😅

Robocopy - 鏡像同步、差異備份

再來就到「處發程序」頁籤,新增「執行的時間」的設定。

Robocopy - 鏡像同步、差異備份

選擇「每天」,重複工作每隔 「5 分鐘」,持續時間「不限制」,在確定最重要的「已啟用」有被勾選,最後按下「確定」,完成「執行的時間」的設定。

Robocopy - 鏡像同步、差異備份

處發程序」頁籤,就會多一筆資料,這樣一來之後「 5 分鐘」就會自動「鏡像同步 (差異備份)」兩個資料夾了 🎉 

Robocopy - 鏡像同步、差異備份

再來就到「動作」頁籤,新增「要執行的程式 (指令碼)」的設定。

Robocopy - 鏡像同步、差異備份

程式或指令碼,選擇剛剛建立的「Windows 批次檔案 (.bat)」,開始位置填入「批次檔案」的路徑,按下「確定」,完成「要執行的程式 (指令碼)」的設定。

Robocopy - 鏡像同步、差異備份

動作」頁籤,就會多一筆資料,在按下「確定」完成所有設定 👍

Robocopy - 鏡像同步、差異備份

工作排程器」上就多了一筆工作後,這樣就可以進行測試了 ~

Robocopy - 鏡像同步、差異備份

在 12 : 55 時,於「TEST」資料夾下,新增一筆資料「8.jpg」。

Robocopy - 鏡像同步、差異備份

5 分鐘後,系統就自動將「8.jpg」複製到「TEST2」資料夾下 🎊

Robocopy - 鏡像同步、差異備份

二、製作成「小工具軟體」範例

大漠備份的頻率沒有很高,暫時沒有打算使用排程作鏡像備份,但又為了自己方便操作,於是就大漠幫 Robocopy 寫了一個「圖形使用者介面 (GUI)」😁

其中「鏡像同步」會用到的「進階指令」,大漠也把它加入進「大漠自製的小工具」,雖然不知道甚麼時候會用到,但我相信以後「進階指令」會用到,重點是「看起來比較專業」😂

Robocopy GUI - 鏡像同步、差異備份

接下來就演示一下「大漠自製的小工具」操作過程 ~

透過「圖形使用者介面 (GUI)」選擇「來源資料夾」,就不怕輸入錯誤,或者打字打得很累 😆

Robocopy GUI - 鏡像同步、差異備份

接續著選擇「目的地資料夾」~

雖然不怕打錯字,但就怕自己選錯囉 😂

所以絕對不要選反,不然要備份的資料,反而被刪除 😖

Robocopy GUI - 鏡像同步、差異備份

「log 路徑」就屬於「進階指令」的範圍囉 ~

如果不小心關掉視窗,還有機會再看看「鏡像同步」的狀況 😊

Robocopy GUI - 鏡像同步、差異備份

在「TEST」資料夾下,新增一筆資料「9.jpg」。

Robocopy GUI - 鏡像同步、差異備份

按下「鏡像同步」開始備份 ~

Robocopy GUI - 鏡像同步、差異備份

視窗下面的「執行結果」會顯示原本「執行 Robocopy 的結果」🎉

Robocopy GUI - 鏡像同步、差異備份

「TEST2」資料夾下,多了一個資料「9.jpg」,確實完成備份 😎

Robocopy GUI - 鏡像同步、差異備份

再來看看「log 檔案」,有出現再大漠指定的「log 路徑」下 👍

Robocopy GUI - 鏡像同步、差異備份

「log 檔案」一樣是記錄著「執行 Robocopy 的結果」😏

從「紅框 1」的內容中,可以看出來大漠使用的「鏡像同步」指令。

而 「紅框 2」的內容中,可以看到「Robocopy」發現了一個新檔案「9.jpg」,並有完成備份,執行進度為 100% 😊

Robocopy GUI - 鏡像同步、差異備份

三、 Robocopy 指令說明

(一)、「基本指令」說明

1. 「鏡像同步」基本指令

鏡像同步的「基本指令」指令,有以下兩種 :

如果檔案有設定過「安全性設定」,如 : 特定帳號才可瀏覽編輯的設定,就建議使用「第一種指令」,確保複製過後去的檔案也保留這些「安全性設定

如果自己也不清楚的話,還是建議使用「第一種指令」最保險 😆


// 第一種,會覆寫「目的地資料夾」安全性設定。
Robocopy <來源資料夾(檔案)> <目的地資料夾(檔案)> /mir /xo /e

// 第二種,不覆寫「目的地資料夾」安全性設定。
Robocopy <來源資料夾(檔案)> <目的地資料夾(檔案)> /e /xo /purge

2. 「指令參數」說明


/e
複製子資料夾 (包含空的資料夾)
  
/xo
比較「來源檔案」與「目的地檔案」,若「來源檔案」較新則複製,否則排除不複製 (差異備份,所需參數)
  
/purge
刪除不存在於「來源資料夾」中的檔案 (差異備份,所需參數)
  
/mir 
鏡像資料夾 (相當於同時使用 /e 和 /purge 參數)。

(二)、「進階指令」說明

1.  「鏡像同步」進階指令

大漠針對了「搬檔效率」、「Log 資訊」需求,又挑選了部分的參數做使用,使其功能更完善 😎

更多參數詳 微軟 Robocopy 學習網


Robocopy <來源資料夾(檔案)> <目的地資料夾(檔案)> /e /xo /mir /mt: /dcopy:dat /xa:sh /xj /unicode /eta /R:5 /W:30 /tee /unilog+:D:\mirrorDir.txt /v 

2. 「指令參數」說明


/mt:<n> 
使用 n 個執行緒,執行工作。(如同 n 個人一起搬運檔案) 預設值是 8,最上值128。
需搭配使用 /log 參數,集中倒出,提升效能。
  
/log:<logfile>
使用系統編碼(Big5)寫入記錄檔。(若記錄檔已存在,覆寫現有的記錄檔)

/log+:<logfile>
使用系統編碼(Big5)寫入記錄檔。(若記錄檔已存在,接續寫入記錄檔)

/unilog:<logfile>
使用 UTF-8 編碼寫入記錄檔。(若記錄檔已存在,覆寫現有的記錄檔)

/unilog+:<logfile>
使用 UTF-8 編碼寫入記錄檔。(若記錄檔已存在,接續寫入記錄檔)

/dcopy:<copyflags> 
複製資料夾的內容。
D - 資料
A - 屬性
T - 時間戳記
E - 擴充屬性
X - 略過替代資料流
此選項的預設值為 DA (資料和屬性)。

/xa:[RASHCNETO]
符合以下屬性的檔案不處理。
R - 唯讀
A - 封存
S - 系統
H - 隱藏
C - 已壓縮
N - 未編製內容索引
E - 已加密
T - 暫存
O - 離線

/xj  
不複製 NTFS junction 檔案。

/unicode 
輸出內容使用 UTF-8 編碼。

/eta
顯示所複製檔案的預估抵達時間 (ETA)。

/r:<n> 
複製失敗,重新嘗試的次數,n 的預設值為 1,000,000 (一百萬次重試)。

/w:<n> 
複製失敗,重新嘗試的等候時間,以秒為單位,n 的預設值為 30 (等待時間為 30 秒)。

/tee 
將狀態輸出寫入主控台視窗及記錄檔。

/v 
產生詳細資訊輸出,並顯示所有略過的檔案。

(三)、「最終指令」說明 (最推指令)

1.  「鏡像同步」最終指令

這大漠自己在用的指令,也是最推薦的指令,顧及了「搬檔效率」、「Log 資訊」和「資安疑慮」🚓


Robocopy <來源資料夾(檔案)> <目的地資料夾(檔案)> /e /xo /mir /mt: /dcopy:dat /xa:sh /xj /unicode /eta /R:5 /W:30 /tee /unilog+:D:\mirrorDir.txt /v /xf *.tmp *.ds_store *.temp ~desktop.ini ~hiberfil.sys ~pagefile.sys ~thumbs.db ~swapfile.sys ~NTUSER.DAT ~ntuser.dat.LOG1 ~ntuser.dat.LOG2 $recycle.bin config.msi ntuser.dat ntuser.ini /xd "C:\Windows" "C:\ProgramData\Microsoft\Windows\Caches" "C:\Drivers" "C:\Temp" "C:\Documents and Settings" "*MSOCache*" "*RecycleBin*" "*recycler*" "*System Volume Information*"

2. 「指令參數」說明

避免複製系統的重要檔案,引發資安問題,大漠就使用「/xf」及「/xd」兩項參數,排除了系統「特定檔案」及「特定路徑」。

以下說明有列出排除「檔案」及「路徑」,給大家參考。

 
/xf <filename>[ ...]
符合指定名稱或路徑的檔案,支援使用萬用字元 (* 和 ?)。
*.tmp 
*.ds_store 
*.temp 
~desktop.ini 
~hiberfil.sys 
~pagefile.sys 
~thumbs.db 
~swapfile.sys 
~NTUSER.DAT 
~ntuser.dat.LOG1 
~ntuser.dat.LOG2 
$recycle.bin 
config.msi 
ntuser.dat 
ntuser.ini 

/xd <directory>[ ...] 
排除符合指定名稱和路徑的目錄。
"C:\Windows" 
"C:\ProgramData\Microsoft\Windows\Caches" 
"C:\Drivers" 
"C:\Temp" 
"C:\Documents and Settings" 
"*MSOCache*" 
"*RecycleBin*" 
"*recycler*" 
"*System Volume Information*"

精選美景 - 周邊商品 (提供客製化服務)

大漠有設計簡單的程式碼,讓大家可以體驗一下寫程式的感覺,以及呈現結果,並將他製作成周邊商品,如 : 藍芽喇叭、拼圖、鑰匙圈、筆記本、滑鼠、滑鼠墊、鍵盤...等商品

商品類別涉及了電子產品、居家用品、杯子餐廚、服飾、旅行用品、辦公用品...等

有興趣的人可以到 大漠國渡 - 商品小舖 看看喔~  

我的優惠碼 K0999975,可享受 KUSDOM 全場 9 折優惠。 

大漠國渡 - 商品小舖 (KUSDOM)

精選授權圖片

如果您喜歡大漠國渡「攝影照片」的話,可以在 大漠國渡 Shutterstock 的作品集中購買喔 ~

Shutterstock 授權表
如果你也有攝影做作品要分享的話,也歡迎你加入 Shutterstock contributor

如果您喜歡我的內容,可以這樣贊助大漠國渡 (支持創作)

如果您喜歡我的內容,可以透過以下方式贊助大漠國渡,支持創作

Paypal : https://www.paypal.com/paypalme/jay82313tw

悠游付 (EasyWallet APP) : (390) 2202-2122-3306-1876

將來銀行 : (823) 8862-0972-6236-01


留言