windows下robocopy的使用
目录
robocopy是Windows平台下非常好用的同步工具,比起简单的copy,它的功能更强大
比如:
- 多线程模式。/MT选项
- 镜像模式,copy时自动删除target中有而source中不再存在的文件。/mir选项
- copy前检查是否有相同的文件,快速跳过,实现增量copy
- 可重启,相当于断点续传
- 监控模式,可设置一段时间内持续监听source,若有变化立即同步到target。/mon和/mot选项
以上只是简单列举,详细选项请去查官网文档。
下面记录一下我的需求场景与脚本实现。
需求
将电脑个人用户文件夹( $env:USERPROFILE )下某些指定的文件和文件夹同步到H盘的Backup文件夹下。
方案:写一个ps1脚本,配置在Task scheduler里每天自动执行。
脚本实现
<#
$env:USERPROFILE -> c:\user\your_user_name
$env:USERNAME -> your_user_name
#>
$bk_folder = "H:\Backup"
# backup manifest
$folder = '.bash_history',
'.bash_profile',
'.bashrc',
'.condarc',,
'.gitconfig',
'.ssh',
'.vscode',
'Desktop',
'Downloads',
'My Documents'
# for each of above file and folder perform copy or robocopy
foreach($_ in $folder)
{
if (test-path "$env:USERPROFILE\$_" -PathType Leaf)
{
copy "$env:USERPROFILE\$_" "$bk_folder\personal_files\$env:USERNAME"
}
if (test-path "$env:USERPROFILE\$_" -PathType Container)
{
robocopy "$env:USERPROFILE\$_" "$bk_folder\personal_files\$env:USERNAME\$_" /e /xa:SHT /mir
}
}
功能说明:先枚举要备份的根目录下的文件和文件夹,然后遍历,如果是文件直接用copy命令,文件夹则用强大的robocopy
测试与日志
- 以上脚本只是实现了核心的功能,在开发过程中可以使用robocopy的
/l选项,可以实现仅打印出受影响的文件列表,而不直接执行操作,非常方便进行测试 - 为方便日后进行故障排查,可增加日志选项,用robocopy自带的日志选项,或直接用输出重定向
总结与说明
- robocopy的source和target只能是文件夹
- robocopy只支持在copy时排除特定文件夹,但不直接支持只包括特定文件夹,如果这些文件或文件夹的命令有某种规则,可以用通配符来实现,否则就只能分多个步骤去copy
- copy之后的文件夹可能会被隐藏,貌似是一个Bug,所以如果发现copy之后文件找不到,不用紧张,先将查看隐藏文件的选项打开,或用 类似
ls -a命令查看所有文件