Robocopy实战文件备份
Robocopy实战文件备份
robocopy 是 windows 系统自带的一个强大的命令行文件夹/文件复制工具,它有非常多的参数可以配置。在数据同步中,robocopy 可用于编写自动同步脚本,如镜像同步目录 a 到目录 b,或增量同步 a 到 b 等,适合作为数据备份脚本。
🔍robocopy 语法
1 |
|
🚀命令行参数速查
/S
常用于不希望删除目标目录的备份方式
使用 /s
来完整复制子目录,相当于直接两个文件夹之间复制粘贴,也相当于 Linux 上的递归复制;
相同文件,被源目录替换;源目录多的文件,目标目录不受影响;
例:模拟把 D:\a 文件夹内所有文件复制,粘贴到 D:\b 文件夹下,并替换同名文件,/MT:1 参数后面说明。
1 |
|
/B
不常用;
使用 /b
在备份模式下复制文件。 备份模式允许 Robocopy (ACL) 替代文件和文件夹权限设置。 这样,就可以复制你可能无权访问的文件,前提是该文件在具有足够权限的帐户下运行;
/MIR
常用于镜像备份文件夹,目标文件夹会与源文件夹保持一致。
使用 /mir
来镜像复制,将此选项与 /e 选项和目标目录结合使用,覆盖目标目录安全设置。
例:模拟把 D:\a 文件夹内所有文件复制,粘贴到 D:\b 文件夹下,并替换同名文件,并删除 b 内的多余文件。相当于让 b 完全保持与 a 相同的文件结构。
1 |
|
/MT
使用 /mt:2
指定复制时线程数为 2;
重要: 在一切机械硬盘,无论CMR垂直还是SMR叠瓦,都应当使用 /MT:1 开启单线程写入;固态硬盘也推荐使用此参数。对于SMR叠瓦盘,不开启 /MT:1 的默认 8 线程写入会大幅降低硬盘寿命;
/COPY
若不希望用管理员身份执行robocopy,可添加 /COPY:DT 参数,避免复制文件属性
使用 /copy:flag
指定要复制的文件属性。 此选项的有效值为:D - 数据A - 属性T - 时间戳S - NTFS 访问控制列表 (ACL)O - 所有者信息U - 审核信息此选项的默认值为 DAT (数据、属性和时间戳) 。
📝重要规则(必读)
下面这些非常重要
- 在一切机械硬盘,无论CMR垂直还是SMR叠瓦,都必须添加 **/MT:1 **参数开启单线程写入;
- 使用批处理时,文件编码必须为 ANSI, GBK 中的一种(GBK 和 ANSI 在 Windows 上等价)。
- 使用管理员权限执行 robocopy 命令,或者使用 /COPY:DT 参数规避文件属性复制;
- 在执行前,仔细检查 robocopy 命令,尤其是开启了 /MIR 参数的命令,防止意外删除文件。在命令运行时,命令行会实时输出当前正在复制的源目录。若发现正在一行行输出的目录是自己的目标目录,说明设置反了方向,立即按下 Ctrl+C 终止命令;
🌎关于编码
使用记事本的另存为
功能,可以选择为 ANSI 编码;
使用专业编辑器如 VS Code, Sublime Text, Notepad++ 等,则设置为 GBK 编码(不是 GB2312)。
若自己编写命令生成软件,则生成的批处理必须使用 GBK。
如在 Python 内通过向 open() 函数传递 encoding="gbk"
来指名编码。
1 |
|
若在 C# 内,使用如下代码:
1 |
|
🗡️数据同步实战
文件夹单向同步
例如,把 D:\test
镜像同步到 E:\test
下,这将保证 E:\test 与 D:\test 完全一致,来自 D 的文件将覆盖 E 的文件,E 中多余的文件将被删除,适用于文件夹的单向同步。
1 |
|
文件夹同步到冷备份硬盘
把 D:\test
镜像同步到 E:\test
下。
1 |
|
文件夹普通复制备份
把 D:\test
普通同步到 E:\test
下,不删除不同的文件,等价于复制时选择替换重名文件 。
1 |
|
不复制文件的属性
把 D:\test
镜像同步到 E:\test
下,使用 /COPY:DT
不保留文件的属性,适用于不使用管理员身份运行。
1 |
|
使用以上命令时,可能遇到文件属性和无法找到文件的问题,如遇到则仍然使用管理员身份运行即可解决。
部分选项
选项 | 说明 |
---|---|
/s | 复制子目录。 此选项自动排除空目录。 |
/e | 复制子目录。 此选项自动包括空目录。 |
/lev:<n> |
仅复制源目录树的前 n 个级别。 |
/z | 以可重启模式复制文件。 在可重启模式下,如果文件副本中断,Robocopy 可以选取它离开的位置,而不是重新复制整个文件。 |
/b | 在备份模式下复制文件。 备份模式允许 Robocopy (ACL) 替代文件和文件夹权限设置。 这样,就可以复制你可能无权访问的文件,前提是该文件在具有足够权限的帐户下运行。 |
/zb | 以可重启模式复制文件。 如果文件访问被拒绝,请切换到备份模式。 |
/j | 使用建议用于大型文件) 使用无缓冲区 I/O (的副本。 |
/efsraw | 复制 EFS RAW 模式下的所有加密文件。 |
/copy:<copyflags> |
指定要复制的文件属性。 此选项的有效值为:D - 数据A - 属性T - 时间戳S - NTFS 访问控制列表 (ACL)O - 所有者信息U - 审核信息此选项的默认值为 DAT (数据、属性和时间戳) 。 |
/dcopy:<copyflags> |
指定要在目录中复制的内容。 此选项的有效值为:D - 数据A - 属性T - 时间戳此选项的默认值为 DA (数据和属性) 。 |
/秒 | 复制安全 (等效 于 /copy:DATS) 的文件。 |
/copyall | 复制与 /copy:DATSOU) 等效的所有文件信息 (。 |
/nocopy | 复制任何文件信息, (/purge) 很有用。 |
/secfix | 修复了所有文件的文件安全性,甚至跳过了这些文件。 |
/timfix | 修复了所有文件的文件时间,甚至跳过了这些文件。 |
/purge | 删除源中不再存在的目标文件和目录。 将此选项与 /e 选项和目标目录结合使用,允许不覆盖目标目录安全设置。 |
/mir | 镜像与 /e 和 /purge) 等效的目录树 (。 将此选项与 /e 选项和目标目录结合使用,覆盖目标目录安全设置。 |
/mov | 移动文件,并在复制文件后从源中删除这些文件。 |
/move | 移动文件和目录,并在复制这些文件和目录后从源中删除它们。 |
/a+:[RASHCNET] | 将指定的属性添加到复制的文件。 此选项的有效值为:R - 只读A - 存档S - 系统H - 隐藏C - 压缩N - 未编制索引的内容E - 加密T - 临时 |
/a-:[RASHCNET] | 从复制的文件中删除指定的属性。 此选项的有效值为:R - 只读A - 存档S - 系统H - 隐藏C - 压缩N - 未编制索引的内容E - 加密T - 临时 |
/create | 仅创建目录树和零长度文件。 |
/fat | 仅使用 8.3 个字符长度的 FAT 文件名创建目标文件。 |
/256 | 关闭对超过 256 个字符的路径的支持。 |
/mon:<n> |
监视源,并在检测到超过 n 个 更改时再次运行。 |
/mot:<m> |
监视源,并在检测到更改时以 m 分钟为单位再次运行。 |
/mt[:n] |
使用 n 个线程创建多线程副本。 n 必须是介于 1 和 128 之间的整数。 n 的默认值为 8。 为了提高性能,请使用 /log 选项重定向输出。/mt 参数不能与 /ipg 和 /efsraw 参数一起使用。 |
/rh:hhmm-hhmm | 指定可以启动新副本的运行时间。 |
/pf | 检查每个文件的运行时间, (不按传递) 。 |
/ipg:n | 指定数据包间差距,以在慢速线路上释放带宽。 |
/sj | 将连接 (软链接) 复制到目标路径而不是链接目标。 |
/sl | 不要关注符号链接,而是创建链接的副本。 |
/nodcopy | (默认 /dcopy:DA) 不复制任何目录信息。 |
/nooffload | 在不使用 Windows 复制卸载机制的情况下复制文件。 |
/compress | 请求文件传输期间的网络压缩(如果适用)。 |
退出 (返回) 代码
Value | 说明 |
---|---|
0 | 未复制任何文件。 未遇到任何失败。 没有不匹配的文件。 目标目录中已存在这些文件;因此,跳过了复制操作。 |
1 | 已成功复制所有文件。 |
2 | 目标目录中存在一些其他文件,这些文件不在源目录中。 未复制任何文件。 |
3 | 复制了一些文件。 存在其他文件。 未遇到任何失败。 |
5 | 复制了一些文件。 某些文件不匹配。 未遇到任何失败。 |
6 | 存在其他文件和不匹配的文件。 未复制任何文件,也不会遇到任何故障。 这意味着文件已存在于目标目录中。 |
7 | 文件已复制,存在文件不匹配,并且存在其他文件。 |
8 | 多个文件未复制。 |
附:自动管理员身份运行
将以下命令复制到一个 bat 文件中,双击即可管理员身份运行。注意用 ANSI 或者 GBK 编码批处理文件。
1 |
|