iT邦幫忙

0

用robocopy複製檔案

  • 分享至 

  • xImage
  •  

語法

robocopy 來源資料夾  目的地資料夾  檔名  選項

設定範圍

來源

robocopy  C:\a.txt  D:\backup

robocopy會認為C:\a.txt是個資料夾
如果沒有找到C:\a.txt資料夾,會報錯

目的地

robocopy  C:\src  D:\backup

如果D:\backup不存在,會自動建立資料夾

資料夾路徑的寫法

rem 路徑有空格,需要加雙引號
rem 反斜線 + 雙引號 \" 會導致錯誤
robocopy  "C:\src  123\"  D:\backup


rem 正確寫法 路徑最後面不要加 \
robocopy  "C:\src  123"  D:\backup
rem 正確寫法 路徑最後面加 \\
robocopy  "C:\src  123\\"  D:\backup
rem 路徑沒有空格,加了雙引號,報錯
robocopy  "C:\"  D:\backup
rem 正確寫法 路徑最後面加 \\
robocopy  "C:\\"  D:\backup
# PowerShell
# 路徑沒有空格,加了雙引號,OK
robocopy  "C:\"  D:\backup
# 一樣意思
robocopy  'C:\'  D:\backup
# 一樣意思
$a = "C:\"
robocopy  $a  D:\backup

# 字串沒有空格,PowerShell在傳參數給robocopy時
# 就不會多加雙引號

# 字串有空格,就會加雙引號
# 最後的反斜線要寫成 \\

資料夾之間的檔案複製

robocopy  C:\src  D:\backup

複製C:\src裡面的檔案,到D:\backup裡面

不是把C:\src資料夾複製貼上到D:\backup裡面、成為D:\backup\src

預設值:只複製一層檔案、不複製子資料夾

要複製的檔案

rem 複製所有檔案
robocopy  C:\src  D:\backup

rem 複製 *.txt  *.jpg  a.zip
robocopy  C:\src  D:\backup  *.txt  *.jpg  a.zip

可以使用萬用字元
只能提供檔名,不可以帶有路徑
隱藏檔也會複製

資料夾的層數

rem 預設值:不複製子資料夾
robocopy  C:\src  D:\backup  *.txt  a.zip
robocopy  C:\src  D:\backup  *.txt  a.zip

rem 每一層
robocopy  C:\src  D:\backup  *.txt  a.zip /S
robocopy  C:\src  D:\backup  *.txt  a.zip /E

rem 兩層:來源資料夾、第一層子資料夾
robocopy  C:\src  D:\backup  *.txt  a.zip /S  /LEV:2
robocopy  C:\src  D:\backup  *.txt  a.zip /E  /LEV:2

/S 為了放複製過來的檔案,而建立子資料夾
/E 先建立子資料夾。如果沒有檔案要放進去,就變成空資料夾


縮小範圍

by 檔名、資料夾名

rem /XF 要排除的檔名。可以用 (路徑 + 檔名)
robocopy  C:\src  D:\backup  *.txt  /XF a* C:\src\b*

rem /XD 要排除的資料夾名。可以用 (路徑 + 資料夾名)
robocopy  C:\src  D:\backup  *.txt  /XD a* C:\src\b*

by 檔案大小

rem /MAX:n 最多 n bytes
robocopy  C:\src  D:\backup  *.txt  /MAX:10000

rem /MIN:n 至少 n bytes
robocopy  C:\src  D:\backup  *.txt  /MIN:2000

by 修改日期

/MAXAGE

rem 最多7天。7天之內
rem 時間軸方向:7天前的時間點,往右
robocopy  C:\src  D:\backup  *.txt  /MAXAGE:7

rem 時間軸方向:往右
robocopy  C:\src  D:\backup  *.txt  /MAXAGE:20240801

/MINAGE

rem 至少7天。7天起跳
rem 時間軸方向:7天前的時間點,往左
robocopy  C:\src  D:\backup  *.txt  /MINAGE:7

rem 時間軸方向:往左
robocopy  C:\src  D:\backup  *.txt  /MINAGE:20240801

by 存取日期

/MAXLAD:n
/MINLAD:n
(如果 n < 1900 則 n = n 日,否則 n = YYYYMMDD 日期)。

by 屬性

/IA:屬性 包含指定屬性的檔案
/XA:屬性 排除指定屬性的檔案
/A 選擇有A屬性的檔案
/M 選擇有A屬性的檔案。複製完之後,清除來源檔的A屬性

沒有被選擇,即排除

rem 只要有R屬性、A屬性其中一個屬性,就選擇
robocopy  C:\src  D:\backup  *.txt  /IA:RA

rem 只要有H屬性、S屬性其中一個屬性,就排除
robocopy  C:\src  D:\backup  *.txt  /XA:HS

可指定的屬性

R 唯讀
A 封存
S 系統
H 隱藏
C 已壓縮
N 未編製內容索引
E 已加密
T 暫存
O 離線

排除各種類型的檔案

/XL 排除只有來源有的檔案

/XJ 排除 符號連結 (同時適用於檔案與目錄) 和連接點。
/XJD 排除 目錄和連接點的符號連結。
/XJF 排除 檔案的符號連結。


檔案類別

檔案類別 來源 目的地 備註
New新檔案 Yes No 沒有使用/XL排除
Lonely孤立的 Yes No 有使用/XL排除
Extra File其他檔案 No Yes 檔名有關
Extra Dir 其他目錄 No Yes 通常跟層數有關
Mismatched不相符 Yes(檔案) Yes(資料夾) 或左右情況相反

兩邊都有的同名檔案

  1. 修改時間不同。(預設值:複製)
     /XO 排除較舊的檔案
     /XN 排除較新的檔案

  2. 修改時間相同、檔案大小不同。(預設值:複製)
     /XC 排除變更的檔案

  3. 修改時間相同、檔案大小相同。(預設值:略過)
     /IT 包含修改時間相同檔案大小相同屬性不相同的檔案
     /IM 包含修改時間相同檔案大小相同屬性相同$MFT修改時間不同的檔案
       /SEC(也就是 /COPY:DATS),有 /IM 的效果

 /IS 包含修改時間相同檔案大小相同屬性相同$MFT修改時間相同的檔案

檔案類別 修改時間 檔案大小 屬性 $MFT修改時間
Newer較新 來源 > 目的地
Older較舊 來源 < 目的地
Changed已變更 相同 不同
Tweaked已調整 相同 相同 不同
Modified已修改 相同 相同 相同 不同
Same相同 相同 相同 相同 相同

NTFS磁碟機的檔案時間

  • 建立時間
  • 修改時間(修改檔案內容)
  • 存取時間
  • $MFT修改時間(修改檔案名稱、權限、屬性…等等)

NTFS、FAT32的時間精密度不一樣

robocopy  C:\src  D:\backup  *.txt

C:\src\1.txt (NTFS磁碟機)
檔案修改時間 11:27:12.9051975

D:\backup\1.txt (FAT32磁碟機、2秒精密度)
檔案修改時間 11:27:14

當一個是NTFS磁碟機,另一個是FAT32磁碟機時,
會把NTFS磁碟機的檔案時間,轉成FAT32的精密度,再進行比較

雖然實際上,兩個檔案的時間不同,
robocopy可能會認為時間相同

從FAT32磁碟機複製過來的檔案

C:\src\1.txt (NTFS磁碟機)
檔案修改時間 11:27:12.9051975

C:\2\1.txt (NTFS磁碟機、這個檔案是從FAT32磁碟機複製過來的)
檔案修改時間 11:27:14

兩個都是NTFS磁碟機的檔案
使用 /FFT 參數,把兩者的時間,轉成FAT32的精密度,再進行比較
根據比較結果,進行複製or略過

robocopy  C:\src  C:\2  *.txt  /FFT

rem 不管複製還是略過,都複製時間
robocopy  C:\src  C:\2  *.txt  /FFT  /TIMFIX

複製檔案資訊 /COPY

D - 資料
A - 屬性
T - 時間戳記
X - 略過替代資料流
S - NTFS 存取控制清單 (ACL)
O - 擁有者資訊
U - 稽核資訊

如果使用 /B 或 /ZB,則會忽略 X 旗標。

rem 預設值:複製「資料」、「屬性」、「時間戳記」
robocopy  C:\src  D:\backup
rem 上下兩行一樣效果
robocopy  C:\src  D:\backup  /COPY:DAT


rem 複製「資料」、「屬性」、「時間戳記」、「權限」
robocopy  C:\src  D:\backup  /COPY:DATS
rem 上下兩行一樣效果
robocopy  C:\src  D:\backup  /COPY:SEC


rem 複製全部內容
robocopy  C:\src  D:\backup  /COPY:DATSOU
rem 上下兩行一樣效果
robocopy  C:\src  D:\backup  /COPYALL


rem 只更新時間 (同名檔案需要存在。否則略過)
robocopy  C:\src  D:\backup  /COPY:T

rem 只更新權限 (同名檔案需要存在。否則略過)
robocopy  C:\src  D:\backup  /COPY:S

rem 用瀏覽器下載的檔案,有替代資料流 Zone.Identifier
rem 使用 X 跳過、不複製替代資料流
robocopy  C:\src  D:\backup  /COPY:DATX

複製資料夾資訊 /DCOPY

D - 資料
A - 屬性
T - 時間戳記
E - 擴充屬性
X - 略過替代資料流
此選項的預設值為 DA (資料和屬性)。

複製之後,設定屬性

/a+:[RASHCNET]
/a-:[RASHCNET]

R - 唯讀
A - 封存
S - 系統
H - 隱藏
C - 已壓縮
N - 未編製內容索引
E - 已加密
T - 暫存
O - 離線 (移除only)

複製symlink

rem 預設值:複製symlink的目標,而不是symlink本身
robocopy  C:\src  D:\backup

rem 複製symlink本身。需要系統管理員權限
robocopy  C:\src  D:\backup  /SL

/SECFIX

使用/SECFIX時,指定要複製哪些內容

  • /COPYALL
  • /COPY:O
  • /COPY:S
  • /COPY:U
  • /SEC

複製稀疏檔案

/SPARSE:<y|n>
是否保留檔案的疏鬆狀態
預設值:是


刪除

/PURGE 刪除目的地多的檔案、資料夾

刪除目的地多的檔案

只跟選擇處理的檔名有關
跟檔案大小、日期無關

rem 刪除目的地多的檔案,而且,檔案名稱a*
robocopy  C:\src  D:\backup  a*  /PURGE

刪除目的地多的資料夾

刪除C:\src\a1 資料夾

rem 可以刪除,資料夾名稱a1符合a*
robocopy  C:\src  D:\backup  a*  /PURGE

rem 沒反應
robocopy  C:\src  D:\backup  a*  /PURGE  /S  /LEV:1

rem 可以刪除,跟a*無關
robocopy  C:\src  D:\backup  a*  /PURGE  /S  /LEV:2

rem 可以刪除,指定x* 證明跟資料夾名稱無關
rem 跟資料夾層數 /LEV 有關
robocopy  C:\src  D:\backup  x*  /PURGE  /S  /LEV:2

rem 可以刪除
robocopy  C:\src  D:\backup      /PURGE  /S  /LEV:2

rem 可以刪除。刪除每一層「多的資料夾」
robocopy  C:\src  D:\backup      /PURGE  /S

複製來源檔之後,刪除來源檔

/MOV 複製來源檔之後,刪除來源檔

rem 同名檔案相同時,略過、不複製,不會刪除來源檔
rem 使用 /IS 參數,同名檔案相同時,也進行複製,就會刪除來源檔
rocobopy  C:\src  D:\backup  /IS  /MOV

rem 只更新時間,也會刪除來源檔
rem 只對「存在、而且沒有被略過」的目的地檔案,更新時間
rocobopy  C:\src  D:\backup  /COPY:T  /MOV

/MOVE 複製來源檔之後

  1. 刪除來源檔
  2. 刪除資料夾
    如果資料夾裡面的檔案已經刪除,沒有檔案留著,
    資料夾是空的,就會刪除資料夾

如果資料夾本來就是空的,也會刪除資料夾

如果資料夾裡面還有檔案留著,
就不會刪除資料夾

經過測試

  1. 來源資料夾的子資料夾可以被刪除
  2. 來源資料夾本身,使用中,無法被刪除

複製模式

鏡像(使兩邊內容一樣)

/MIR (等於 /E /PURGE)
複製各層檔案
刪除「來源沒有、目的地有」的檔案

rem 來源資料夾(一層)
robocopy  C:\src  D:\backup  /PURGE

rem 每層資料夾
robocopy  C:\src  D:\backup  /E /PURGE
rem 每層資料夾
robocopy  C:\src  D:\backup  /MIR

只刪除來源沒有、目的地有的檔案,不進行複製

rem 來源資料夾(一層)
robocopy  C:\src  D:\backup  /PURGE /NOCOPY

rem 每層資料夾
robocopy  C:\src  D:\backup  /E /PURGE /NOCOPY
rem 每層資料夾
robocopy  C:\src  D:\backup  /MIR /NOCOPY

只處理同名檔案

rem 排除「來源有、目的地沒有」的檔案
robocopy  C:\src  D:\backup  *.txt /XL

建立資料夾結構、不複製檔案

robocopy  C:\src  D:\backup  /E  /NOCOPY

建立空檔案

robocopy  C:\src  D:\backup  *.txt  /CREATE

當目的地檔案不存在時,建立空檔案
修改時間一樣,但是,檔案大小為0

當目的地檔案存在時,略過、不處理

刪除7天以外的檔案

rem 建立空資料夾
md  D:\empty

rem 建立空檔案(7天以外)
robocopy  C:\src  D:\empty  /MINAGE:7  /CREATE

rem 複製時間後,刪除來源檔
robocopy  C:\src  D:\empty  /MINAGE:7  /COPY:T  /MOV

快速刪除資料夾的內容

rem 建立空資料夾
md  D:\empty

robocopy D:\empty C:\src /MIR

效率

/MT:n 以 n 個執行緒執行多執行緒複製 (預設值為 8)
  n 必須至少為 1,但不可以大於 128
  此選項與 /IPG 和 /EFSRAW 選項不相容
  請使用 /LOG 選項重新導向輸出,以獲得更好的效能

/R:n 失敗複本的重試次數: 預設值是 1 百萬次
/W:n 重試之間等候時間: 預設值是 30 秒
預設值太大,調小一點

符合條件時,進行複製

只在時間範圍內,進行複製

時間還沒到,等待
時間到,開始複製
/RH 時間範圍

robocopy  C:\src  D:\backup  /RH:1700-0900

執行時間還沒有到,會出現以下訊息
> 小時 : 暫停時間從 10:00 到 17:00...

/PF 每個檔案複製前,都檢查是否在時間範圍內

robocopy  C:\src  D:\backup  /RH:1700-0900  /PF

符合條件進行複製

/MON:n 監視來源; 看到 n 個字元以上時再次執行。
/MOT:m 監視來源; m 分鐘後如果變更,則再次執行。


狀況排除

空間不夠

/LFSM低可用空間模式中運作
當複製導致可用空間低於下限值時,robocopy 就會暫停。
沒有指定下限值時,預設值:10%
與 /MT 和 /EFSRAW 不相容

rem X:\ 是 VHD掛載的NTFS磁碟機

rem 複製到500MB的檔案到 X:\ (可用空間:984MB)
robocopy  .\  X:\ 1.mp4  /LFSM:700M

rem 複製了285MB的時候,出現以下訊息

rem 等候可用空間;可用空間 699.36 m
rem 等候 30 秒... 正在重試...

如果把X:格式化成FAT32
進行複製時,不會暫停
出現以下訊息
警告:無法查詢磁碟區空間; /LFSM 不會監視不足的可用空間。

儘管沒有權限讀取這個檔案

/B 在備份模式複製檔案
需要這兩個備份權限SeBackupPrivilegeSeRestorePrivilege

使用中的檔案

robocopy不能複製使用中的檔案

如果目的地檔案沒有存在,會報錯
如果目的地檔案已經存在,不會報錯,只會複製時間,不複製內容

網路

/Z 在可重新啟動模式複製檔案
/IPG:n 慢速線路可用頻寬,封包之間的差距 (毫秒)
/TBD 等候共用名稱 (重試錯誤 67)
/COMPRESS 在檔案傳輸期間要求網路壓縮 (如適用)

儘量使用UNC path,不要使用掛載的磁碟機代號


命令結果

/L 只列出清單。不做實際的寫入動作。

命令輸出有三個部份

  1. 使用的參數 (使用/NJH關閉顯示)
  2. 檔案清單
      /TS 檔案時間戳記
      /FP 檔案的完整路徑名稱
      /NS 不記錄檔案大小
      /NC 不記錄檔案類型
      /NFL 不記錄檔案名稱
      /NDL 不記錄目錄名稱
      /NP 不顯示複製百分比
      /ETA 顯示複製的檔案預估到達時間
  3. 統計 (使用/NJS關閉顯示)

兩個資料夾的差別

set FileOnly=/NJH  /NJS  /NC  /NS  /NDL

rem mismatched(不符合)的檔案仍然會被列出來
rem 以下:沒有子資料夾的情況

rem 左邊only:排除兩邊/XO /XN、排除右邊/XX
robocopy  C:\src  D:\backup  /L  %FileOnly%  /XO  /XN  /XX

rem 兩邊都有的:排除左邊/XL、包含兩邊/IS /IT /IM、排除右邊/XX
robocopy  C:\src  D:\backup  /L  %FileOnly%  /XL  /IS  /IT  /IM  /XX

rem 右邊only:排除左邊/XL、排除兩邊/XO /XN
robocopy  C:\src  D:\backup  /L  %FileOnly%  /XL  /XO  /XN

Unicode

/UNICODE 正確顯示unicode,而不是顯示成問號

儲存到檔案

/LOG:file (覆寫)
/LOG+:file (附加)
/UNILOG:file (覆寫)
/UNILOG+:file (附加)

/TEE 輸出至主控台視窗,以及記錄檔

儲存複製設定

rem 把複製設定 (/SAVE前面的參數內容)
rem 儲存到job1.RCJ  (ANSI編碼)
rem 如果不使用 /QUIT 仍然會執行命令
robocopy  C:\src  D:\backup  *.txt  *.jpg  /SAVE:job1  /QUIT

rem 可以不指定來源、目的地
robocopy  *.txt  *.jpg  /SAVE:job1  /QUIT

rem 使用job1.RCJ
robocopy /JOB:job1

rem 使用job1.RCJ(如果設定檔裡沒有來源、目的地)
robocopy  C:\src  D:\backup  /JOB:job1

命令傳回值

code 意思
16 不能複製任何檔案(語法錯誤、權限不足)
8 有些檔案複製失敗
4 不符合:相同名稱,一邊是檔案,另一邊是資料夾
2 目的地:多的檔案
1  有檔案被複製
0 沒有檔案被複製,也沒有錯誤。資料夾已經同步
code 意思
16    嚴重錯誤    
15 失敗 不符 多的 複製
14 失敗 不符 多的   
13 失敗 不符    複製
12 失敗 不符      
11 失敗    多的 複製
10 失敗    多的   
9 失敗       複製
8 失敗         
7    不符 多的 複製
6    不符 多的   
5    不符    複製
4    不符      
3       多的 複製
2       多的   
1          複製
0     同步     

exit code >= 8 有檔案複製失敗

取得exit code

rem cmd
echo %errorlevel%
# PowerShell
echo $LASTEXITCODE

參考資料


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言