robocopy 迁移需用 /copyall 或 /sec 等参数显式保留 ntfs 权限,以管理员身份运行、源目标均为 ntfs 卷、预建目标目录且禁用继承权限;推荐命令为 robocopy "oldservershare" "d: ewshare" /mir /copyall /dcopy:t /r:0 /w:0 /log:c:logsmigrate.log;迁移后须用 icacls 导出并比对 acl 文本验证一致性。
要用 robocopy 迁移数据并完美保留 ntfs 权限,关键不是“复制文件”,而是同步完整的安全上下文——包括 acl、所有者、审计项、时间戳和目录元数据。必须用对参数、跑对权限、做对验证。
必须加上的权限相关参数
Robocopy 默认不碰权限,所有安全信息都得显式指定:
- /COPYALL:最全选项,等价于 /COPY:DATSOU(数据、属性、时间戳、安全描述符、所有者、审核项)
- /SEC:精简替代方案,等价于 /COPY:DATS(含基础权限+时间+数据+属性),适合只要权限不强求所有者/审核的场景
- /DCOPY:T:额外保留文件夹本身的创建/修改时间,对后续审计或比对很有帮助
- /SECFIX:迁移后自动修复目标上已存在但权限不一致的文件(建议在首次全量后增量运行时加)
执行前的硬性前提
缺一不可,否则权限写入会静默失败或部分丢失:
Windows 命令行编码与兼容规范。涵盖 GBK/UTF-8 编码、PowerShell/pwsh 互操作、Python/Node.js、Git 配置及代码生成规则。适用于 Windows 10/11 + MSYS2/Git Bash 环境下的所有命令行操作。
- 命令行必须以本地管理员身份运行(右键→“以管理员身份运行”CMD 或 PowerShell)
- 源和目标路径都必须在NTFS 卷上(FAT32/exFAT 不支持 ACL)
- 当前用户需对源有读取所有属性权限,对目标有写入所有属性 + 更改权限权限
- 目标文件夹需预先创建好,且不要手动设置任何继承权限(让 Robocopy 全权接管)
推荐的完整迁移命令
适用于生产环境跨服务器或跨卷迁移:
robocopy "\OldServerShare" "D:NewShare" /MIR /COPYALL /DCOPY:T /R:0 /W:0 /LOG:C:logsmigrate.log- /MIR:镜像模式,确保目标与源结构、内容、权限完全一致(含自动清理多余项)
- /R:0 /W:0:禁用重试,避免因个别锁定文件卡住整个流程(前提是已预检过文件状态)
- /LOG:全程记录,失败项、跳过项、统计行全部可查,便于回溯
- 源支持 UNC 路径,目标可用本地路径,无需共享目标卷
迁移后必须做的权限验证
不能只看资源管理器里“属性→安全”标签页是否显示用户——那只是界面缓存。要对比原始安全描述符:
- 在源服务器执行:icacls "D:OldShare" /t > C:ackupsource_acl.txt
- 在目标服务器执行:icacls "D:NewShare" /t > C:ackup arget_acl.txt
- 用文本比对工具(如 WinMerge、Beyond Compare 或 fc 命令)逐行比对两个文件
- 若发现差异,可针对性用 robocopy /SECFIX 修复单个目录










