「robocopy」是一個從 Windows Vista 開始就內建於作業系統的指令,
開啟「命令提示字元」,輸入「robocopy/?」,再按下 Enter 鍵,
畫面就會列出它的操作指南,在繁體中文版 Windows 環境下,會顯示正體中文版的說明。
在原生的 Windows XP/Server 2003 環境下,
輸入「robocopy/?」,再按下 Enter 鍵,系統會提示:
「'robocopy' 不是內部或外部命令、可執行的程式或批次檔」。
不過,使用者不必灰心,只要安裝「Windows Server 2003 Resource Kit Tools」,
就可以順利使用「robocopy」指令了,只不過它的界面(操作指南、輸出過程及結果)顯示的是英文。
這個「Resource Kit Tools」雖然冠上「Windows Server 2003」的字樣,
不過,Windows XP 也可以安裝,畢竟 XP 和 Server 2003 使用同一套核心程式。
它的下載網址是:http://www.microsoft.com/en-us/download/details.aspx?id=17657

以前筆者在管理網站伺服器時,就接觸過「robocopy」這個指令了!
「robocopy」的優點列舉如下:
1.內建於 Vista/7 及其以後版本的 Windows,不必另外安裝。
2.可以設定過濾條件,略過「來源資料夾」與「目的資料夾」皆已存在的相同檔案,大幅節省複製時間。
3.可以編寫為批次檔,再利用控制台裡的「排定的工作」,定期執行同步備份。

最近,筆者有感於公司的資料都存放在共用的網路資料夾上,風險實在太高!
除了硬碟可能損壞而造成資料流失之外,
為了方便區域網路內的使用者都能編修檔案,所以共用資料夾設為所有人都能讀寫,
如果某個人不小心把檔案、資料夾刪除了,那就很難救得回來了!
因此,每個星期至少對共用資料夾進行一次備份是非常有必要的。
共用資料夾的文件通常是日積月累產生的,資料量會慢慢成長、越來越大,
但是通常不會去刪除舊資料,因為硬碟空間還很足夠。
如果每次備份時,都用土法煉鋼的方法:
「將備份資料夾的檔案/資料夾全部刪除,再重新由共用資料夾複製到備份資料夾」,
就會浪費太多時間,而且顯得非常的沒有效率。
假設上星期備份時,共用資料夾一共有 10,000 個檔案,佔用 100 GB 的磁碟空間,
這星期要再備份時,共用資料夾的檔案數變為 10,200,佔用空間變為 101 GB,
為了這 200 個大小共計 1 GB 的檔案,就要刪掉那 10,000 個大小共計 100 GB 的檔案,
實在是一種愚蠢的作法!因此學會「robocopy」指令,就會讓備份工作變得更加輕鬆。
「robocopy」的應用方式非常多種,用 Google 搜尋「robocopy 教學」會得到很多結果,
因此以下筆者僅分享自己編寫的批次檔,然後稍作說明,
相信這樣已經足夠滿足很多讀者的需求。

假設「共用資料夾」並不在筆者的本機硬碟上,但是筆者可以透過連線帳號、密碼,
將其掛載為連線網路磁碟機,並賦予「Z:」這個磁碟代號。
「共用資料夾」下有 5 個資料夾(目錄),分別為 AAA、BBB、CCC、DDD、EEE,
筆者只需要備份 AAA、BBB、CCC 這 3 個資料夾,而且只需要產生 1 個 Log 檔。
備份方式是使用大容量的外接式硬碟,透過 USB 傳輸線連接到筆者的電腦上,
而且每次插上外接式硬碟時,系統會指派「F:」磁碟代號給它,
那麼批次檔可以這樣撰寫:

@echo off
echo ==================================================
echo 正在備份 AAA、BBB、CCC 資料夾,並將結果寫入「F:\Log\備份結果.txt」。
echo 備份結束後,本視窗將自動關閉。
echo 正在備份中……(請勿手動關閉本視窗!)
echo ==================================================
@if exist Z:\ (net use Z: /delete) > nul
@ping 127.0.0.1 -n 5 -w 1000 > nul
net use Z: \\共用電腦名稱或 IP\共用資料夾名稱 /user:連線帳號 密碼 /persistent:yes
@ping 127.0.0.1 -n 5 -w 1000 > nul
robocopy "Z:\AAA" "F:\備份資料夾\AAA" /e /xo /purge /log:"F:\Log\備份結果.txt"
robocopy "Z:\BBB" "F:\備份資料夾\BBB" /e /xo /purge /log+:"F:\Log\備份結果.txt"
robocopy "Z:\CCC" "F:\備份資料夾\CCC" /e /xo /purge /log+:"F:\Log\備份結果.txt"

針對上述批次檔內容說明如下:

@echo off
作用是不在畫面上顯示指令列,但是會顯示指令執行結果。

echo 文字
作用是顯示自訂的提示文字。

@if exist Z:\ (net use Z: /delete) > nul
作用為判斷是否存在 Z:,如果存在就刪除 Z:(不會刪除其底下的檔案或資料夾,只是取消掛載),
頭尾加上「@」、「 > nul」的用意是隱藏指令執行結果。

@ping 127.0.0.1 -n 5 -w 1000 > nul
作用為藉由 ping 指令緩衝 5 秒鐘,讓前段指令成功執行完畢。

net use Z: \\共用電腦名稱或 IP\共用資料夾名稱 /user:連線帳號 密碼 /persistent:yes
作用為掛載共用資料夾為 Z: 磁碟機,
如果不需要連線帳號、密碼即可存取,可將「/user:連線帳號 密碼 /persistent:yes」整串刪除。

robocopy "Z:\AAA" "F:\備份資料夾\AAA" /e /xo /purge /log:"F:\Log\備份結果.txt"
作用為將「Z:\AAA」(來源資料夾)複製到「F:\備份資料夾\AAA」(目的資料夾),
參數「/e」的作用:複製子目錄,包括空的子目錄(可以改為「/s」:複製子目錄,空目錄例外)。
參數「/xo」的作用:排除較舊的檔案(排除目的資料夾與來源資料夾具有相同檔名、大小的檔案)。
參數「/purge」的作用:從目的資料夾裡刪除來源資料夾裡已經不存在的檔案及目錄。
參數「/log」的作用:產生日誌檔,如果日誌檔已經存在會被覆蓋。
參數「/log+」的作用:不覆蓋原日誌檔,直接將結果添加到原日誌檔末尾。

需要注意的地方:
1.批次檔需以 ANSI 編碼儲存
 因此批次檔中的路徑(例如上例的 Z:\AAA )不要有 Big5 以外的字元,
 至於比較深層,沒有出現在批次檔中的路徑(資料夾名或檔名),
 使用非 Big5 字元(共匪字、日文、韓文…)時不受影響,可以成功備份。
2.為避免出現在批次檔內的路徑有空白字元干擾(例如:「F:\My Web」),
 可以將路徑加上雙引號(例如:「"F:\My Web"」),這樣就不會造成批次檔執行錯誤。
3.來源資料夾內,某個(些)檔案的檔名只要改一個字,或是移動至不同資料夾,
 robocopy 必須將目的資料夾內對應的檔案刪除,再重新複製,因此會佔用較多同步時間。
4.除非來源資料夾沒有空的資料夾,否則應該儘量用「/e」而非「/s」參數,
 這樣在同步備份結束後,可以在檔案總管中,
 分別對來源資料夾及目的資料夾,按右鍵,選內容,就可以比對檔案數、資料夾數、大小是否一致。
5.執行批次檔前,儘可能關閉來源資料夾、目的資料夾內已經被開啟、執行的檔案
 雖然 robocopy 會略過這些開啟中的檔案,但預設需要等待一段時間,
 而且這也會讓前述的比對工作失準。

arrow
arrow
    全站熱搜

    terryhung 發表在 痞客邦 留言(0) 人氣()