当前位置: 首页 > 默认 > 正文

随心所欲玩复制 详解robocopy

说实话,Windows系统自带的复制功能不仅功能简单,而且定制性也不强,每每在对大量文件进行复制、移动、备份时,总少不了繁杂往复的操作。不过幸好,微软意识到了这一点,为我们提供了一款很强力的复制备份工具:robocopy。

robocopy已被Windows Vista、Windows 7以及Windows Server 2008所集成,网上有网友制作的GUI,有兴趣的童鞋可以下载尝试一下。另外,还在使用xp的童鞋直接在网上下载robocopy GUI吧。

robocopy GUI下载地址:http://www.brothersoft.com/robocopy-gui-105335.html

运行方法有很多种,可以使用Win+R,在“运行”窗口中直接输入命令;或者先启动CMD命令提示符,在命令提示符窗口中输入命令;另外一种则是在文本编辑器(如:记事本)中输入相应命令,保存为*.bat批处理文件双击运行即可。

推荐使用批处理文件,这样子不仅方便了我们保存和修改,还方便了随时随地进行调用。

废话不多说,下面我们就开始实战练习。


天一早,经理从Boss那里得 到一个任务,说是公司要对一个项目制作一些文档,需要这个项目的一些原始资料。于是,这个任务又从经理那里下派到我手上,按他的要求,需要尽可能快的从有 关文件夹中取出合适的内容,并且复制到他U盘(盘符为H)Project文件夹中。其具体要求是整理出:txt文本文件、Word文档、JPG、BMP、 TIF图像。他倒是说得简单,我面对的可是一个有上百个子文件夹至少5层目录结构的超级复杂文件目录树。

好吧,为了能顺利完成,放第一招:

第一招 我想咋复制就咋复制

robocopy D:\Document H:\Project *.txt *.doc *.jpg *.bmp *.tif /s

说明:

参数”/s”的作用是“除了空文件夹以外的所有子目录”。若要将文件夹下的所有文件(包括空文件夹)全部复制到目标文件夹,则上述命令应改为:

robocopy D:\Document E:\Home /e

此处参数”/e”的表示所有子目录(包括空文件夹)。


一个任务很顺利就完成,经理把我叫到办公室,对我的执行效率表示出非常满意,我长出一口气,气刚出到一半,经理就开口了:“还要做个项目概览,你去把一二级目录下的内容再单独整理出来,还拷贝到我的U盘里。”我晕……

刚才小试牛刀,现在见招拆招,放第二招:

第二招 复制文件随心所欲

robocopy D:\Document H:\Project *.txt *.doc *.jpg *.bmp *.tif /s /lev:2

说明:

参数”/lev”表示复制的层级,比如指定为2级,则两层目录下的文件会被复制,更多级下面的则会被忽略。


过一番折腾,经理对我的满意度 算是越来越高了,但对于他而言,总是有解决不尽、也永远搞不清的问题,诸如他会在家选择文件之后按下Ctrl+C,然后第二天来公司在公司电脑上猛按 Crtl+V。哎,这不,他又有新问题了。经过刚才几次复制,他那弱小的U盘已经经不起更多折腾,肚子塞的满满的,可是还有大批文件需要用U盘拷贝,经理 他就挠着头,想啊想,想啊想,终于想出一个办法来,先把不用的文件拷贝到计算机上,再把垃圾文件删除掉!嗯~还真是个好办法,于是乎,他又叫来了我……

同样,怕什么~~~接着放招:

第三招 垃圾文件我可不要

其实实现这个要求很简单,直接在复制的过程中筛选出垃圾文件并且deny掉就好啦~

用如下命令吧:

robocopy H:\Work D:\Work /e /xf *.tmp *.bak

说明:

参数”/xf”意为指定不执行复制操作的文件类型,文件名支持通配符。如果使用参数”/xd”,则表示排除指定的文件夹。


一项任务顺利完成,我哼着小曲 回到了自己的办公室,安安稳稳的坐在椅子上听起音乐。一个上午连续被经理所赞赏,那心情叫一个好啊,索性就用音箱吧~动人的旋律不仅飘到我耳朵里,也到了 隔壁同事耳朵里,这不,隔壁同事又来了,他表示对我艺术审美很是赞赏,同时,还想拷走我所有音乐文件……

天,我的音乐文件夹有好几个G之大,而他拿来的U盘才有碎碎的2G,这可怎么是好呢~

想来想去,他觉得只好忍痛割爱,不要MV了。只是还有一个问题,如果用文件类型排除,那将非常麻烦,在这种情况下,我选择了以下方法:

第四招 大文件我也不要

robocopy F:\music H:\music /e /max:10000000

说明:

使用参数”/max”,可以选择文件大小上限,其单位为byte。如果是”/min”,限定了文件大小的下限。两个参数可以同时使用,限制出所需复制的文件大小的范围。

 

复制指定修改时间的文件

在日常使用中,免不了要通过文件修改时间筛选出最近的文件。如何实现此功能?通过下列命令:

robocopy D:\Document H:\Project /maxage:5

此条命令的意思为将D:Document下修改时间在5天内的文件复制到H:Project下。

参数”/maxage”表示距离今天最远的修改时间,凡是修改时间比这个限制还要早的那些文件都不会被复制。参数”/maxage”可以接受的字符 有数字,或者是日期,表示天数时数字要小于1900,表示日期时需要使用”YYYYMMDD”格式。另外一个与之相对应的参数是”/minage”,表示 距离今天最近的修改时间限制,比这个时间新的文件将不被复制。

因此,我们在实用环境下可以利用”/maxage”和”/minage”来共同限制时间范围。如下例:

robocopy D:\Document H:\Project /maxage:5 /minage:1

此命令则将欲复制的文件范围限定在修改时间在除今天意外的5天以内(是不是有点绕口……我实在描述不清楚了,各位看官请意会吧)。

完全拷贝

在Windows默认的复制粘贴下,如果已存在一个同名文件夹,系统会进行增量复制,而不会进行文件夹的替换操作。如果我们需要使目标文件夹与源文件夹完全相同,也就是说在复制的同时也删除在目标文件夹里存在但源文件夹里并没有的文件。则需要使用以下命令:

robocopy D:\Document H:\Project /mir

参数”/mir”的作用等同于”/purge /e”,”/purge”表示清理目标文件夹内有而源文件夹里没有的文件和文件夹。通过这个命令,能保证源文件夹和目标文件夹在结构与内容上完全相同。此参数对于创建镜像备份时是非常有用的。

移动文件

需要移动文件夹,也就是剪贴,需要使用另外两个参数,先看下例:

robocopy D:\Document H:\Project /move /e

参数”/move”意为移动,而”/e”则表示复制所有子目录包括空文件夹(这一点上篇文章有讲)。

只拷贝文档结构

有时我们只需要拷贝一个多级目录的目录树,或者说只需要它的结构,而不需要它的内容,参考如下命令:

robocopy c:\windows /s /create c:\empty\windows

这样,我们就创建了整个Windows文件夹的目录结构。其中,使用了”/creat”参数,此参数作用即为生成空的文件结构。

还有另外一种剑走偏锋的实现方法:

robocopy c:\windows c:\empty\windows /e /lev:5 /minage:19000101

这是使用了普通的复制方法,指定5层目录,但是却限制了一个机器上不可能有的一个文件修改日期。这样,robocopy就只会拷贝走目录结构,因无文件符合其修改时间限制,因而不会有文件被复制。

不复制隐藏文件

个别情况下文件夹中存在隐私内容,在复制的同时又希望被ignore,因为robocopy支持属性操作,所以只需调用相关参数即可。见下例:

robocopy D:\Photo H:\Photo /e /xa:h

参数”/xa:h”表示将具有隐藏属性的排除出欲复制的范围,与之相对应的是参数”/ia”,表示只复制包括指定属性的文件。

可用的属性有;R只读、A存档、S系统、H隐藏等。

robocopy C:\windows F:\WindowsSysFile /ia:rs

此命令只会将具有只读属性的系统文件复制,而不会操作其他文件。

上文说道,robocopy具有对属性操作的能力,因此,在复制的同时也可以指定文件属性。

使用参数”/A+”与”/A-“,功能分别是将给定的属性添加到复制文件,以及,从复制文件中删除给定的属性。

例如:

robocopy C:\windows F:\WindowsSysFile /e /A-:rsh

这样,不仅将所有文件进行了复制,也删除了诸如只读、系统、隐藏等属性,方便了我们在复制之后对文件进行操作和编辑等。

 

复制同时保留NTFS权限

在使用Windows NT以上的系统时、或在多用户环境下、或者在服务器上,经常要为文件、文件夹指定用户访问、修改的权限(分区格式需要为NTFS),如下图。但是,使用一 般的复制方式并不能保留已有的文件权限设置,这就意味着在文件复制、备份时我们需要重新设置用户权限。不过,使用robocopy可以让我们在复制文件的 时候,保留文件属性、权限、所有者,这些都可以随着复制操作一并赋予到目标文件夹中。

需要实现以上要求,使用以下命令:

robocopy D:\Document E:\Project /e /copyall

 

参数”/copyall”等同于”/copy:DATSOU”,表示将所有源文件夹的信息复制到目标文件夹中。

其具体含义为:

D:文件数据,A:文件属性,T:时间信息,S:权限信息,O:所有者信息,U:审核信息。

如果源文件夹的权限被修改,并且需要将其同样更新目标文件夹的时,并不必需要进行重复复制,只需使用:

robocopy D:\Document E:\Project /is /copy:sou

即可。

如果没有自定义”/copy”的参数,则默认值”/copy:DAT”。

向文件服务器进行集中复制

由于robocopy完全支持文件服务器共享文件夹数据的拷贝,所以我们能够很方便的把相应数据备份到文件服务器上,以免数据丢失。

命令参考:

robocopy D:\Project server_share /e /copyall

如果我们创建了一个环境变量,如定义”%bak%”为”server_share”,那只要输入相应的命令:

robocopy D:\Project %bak% /e /copyall

即可把源文件夹下的文件全部备份到”server_share”下。

当然,如果”server_bak”空间不够时,只要更换环境变量的值到其他文件夹,如”server_new”,上述命令无需更改就可以拷贝到新的文件夹中。

实现定时自动备份

在服务器上(当然不限于服务器),有些数据非常重要,尤其是实时性强的数据,更是需要时时刻刻注意备份,robocopy可以帮我们牢记备份时间, 备份目标等。它能够时时刻刻监视需要备份的目标文件夹,当遇到文件夹被修改或者定时器倒数归零,robocopy就会立即开始备份。在用户不进行额外干预 的情况下,这种监视文件夹的任务不会终止,而会一直进行。

依然使用上例中的文件夹做示范:

robocopy D:\Project E:\Document /e /copyall /mot:10 /mon:5

在此例中,整条命令表示复制并监视源文件夹所有信息到目标文件夹。当执行此命令后,会启动命令提示符窗口,一旦时间过了十分钟,并且源文件夹至少有或5处以上的修改,robocopy就会自动启动另一个进程,执行上述备份操作。

在这个实例中,robocopy能监视的有:源文件夹目录结构、文件、文件(夹)名称、大小、最后修改时间、属性和权限等。凡是以上内容有所变动,都会被robocopy视为一次修改。

参数”/mot”用来定义时间,以分钟记,指的是robocopy执行操作最短倒计时时间。参数”/mon”用来定义最少文件修改次数。

在整个监视过程中,robocopy会自动倒计时并记录修改次数,只有同时符合以上两个条件时,robocopy才会开始执行复制任务。每次执行结 束后,这两个数据都会被清零,并重新开始监视源文件夹,只有当用户关闭命令提示符窗口或者按下”Ctrl+Break”键这个监视进程才会终止。

定时备份

上一篇文章提到了间隔固定时间自动复制备份,这一节第一个内容就来讲讲定时复制备份。

robocopy D:\Project E:\Document /e /rh:1800-1830

与上一篇最后的运行结果一样,运行之后,会开启命令提示符窗口,备份复制操作会等到指定时间自动开始。参数”/rh”的作用便是指定复制开始的时 间,其格式为”HHMM-HHMM”,这个格式实际上规定了一个复制操作可以进行的时间段,只有在这个时间段内,复制才会进行,其他时刻都会挂起,也就是 暂停。时间采用24h制,范围是”0000-2359″。需要注意的是,因为是规定时间段而非时间点,所以前后两个4位数字不可以相同。

计划任务复制

robocopy自身是不能新建计划任务的,但是我们可以迂回一下,使用计划任务运行robocopy脚本即可。利用批处理(*.bat)文件,将需要进行的操作编写好就可以了。

//bat文件示例

robocopy D:\Project E:\Document /e /copyall  /mot:10 /mon:5

例如将上述命令存为c:\autocopy.bat文件。

接下来,打开“开始菜单 -> 控制面板 -> 管理员工具 -> 计划任务”,将autocopy.bat添加进计划任务列表并设置好任务计划即可。

通过如此的迂回,我们便实现了使用计划任务进行复制的设想。

其他技巧

记录复制过程

在默认情况下,robocopy的复制操作过程只会在命令提示符中显示,如果希望产生类似于log日志的文件,可以使用参数”/log:文件名.txt”,结果会以文本文件(*.txt)格式输出并保存。

保存命令以方便调用

在robocopy命令后加上”/save:任务名”,可以将当前操作保存为任务文件,通过使用”/job:任务名”就可以方便的进行调用,再也不需要输入一长串的命令了。此任务文件还可以使用记事本等文本编辑器来编辑。

 

通过本系列前面四篇文章的介绍,大体上对robocopy有了全面的讲解,针对常用的操作也做了比较充分的说明。其实在Windows Server中,大部分的备份工作都是通过这个命令来实现的。

在这最后一篇文章中,给出robocopy的命令格式以及所有的可用参数,供大家以后使用时参考:

命令格式

用法 robocopy 源 目标 [file [file]…] [options]
 源目录(驱动器:\路径 \\服务器\共享\路径)
目标  目标目录(驱动器:\路径 \\服务器\共享\路径)
文件  要复制的文件(名称/通配符: 默认为”*.*”)

复制参数

 
/s 复制子目录,但不复制空的子目录
/e 复制子目录,包括空的子目录
/LEV:n 仅复制源目录树的前n层
/z 在可重新启动模式下复制文件
/b 在备份模式下复制文件
/zb 使用可重新启动模式;如果拒绝访问,请使用备份模式
/EFSRAW 在EFS RAW模式下复制所有加密的文件
/COPY:复制标记 要复制的文件内容(默认为/COPY:DAT)
[ 复制标记:D=数据,A=属性,T=时间戳,S=安全=NTFS ACL,O=所有者信息,U=审核信息 ]
/DCOPY:T 复制目录时间戳
/SEC 复制具有安全性的文件(= /COPY:DATS)
/copyall 复制所有文件信息(= /COPY:DATSOU)
/nocopy 不复制任何文件信息(与 /PURGE 一起使用生效)
/SECFIX 修复所有文件的文件安全性,即使是跳过的文件
/TIMEFIX 修复所有文件的文件时间,即使是跳过的文件
/PURGE 删除源中不再存在的目标文件/目录
/MIR 镜像目录树(= /E  /PURGE)
/MOV 移动文件(复制后从源中删除)
/MOVE 移动文件和目录(复制后从源中删除)
/A+:[RASHCNET] 将给定的属性添加到复制文件
/A-:[RASHCNET] 从复制文件中删除给定的属性
/CREATE 仅创建目录树和长度为零的文件
/FAT 仅使用 8.3 FAT 文件名创建目标文件
/256 关闭超长路径(> 256 字符)支持
/MON:n 监视源:发现多于n个更改时再次运行
/MOT:m 监视源:如果更改,在m分钟时间内再次运行
/RH:hhmm-hhmm 运行小时数 –  可以启动新副本的时间
/PF 以每个文件(而不是每个步骤)为基础检查运行小时数
/IPG:n 程序包间的间距(ms),以释放低速线路上的带宽
/SL 对照目标复制符号链接
/MT[:n] 使用n个线程进行多线程复制(默认值为 8)
n 必须至少为 1,但不得大于 128
该选项与 /IPG 和 /EFSRAW 选项不兼容
使用 /LOG 选项重定向输出以便获得最佳性能

文件参数

/A 仅复制具有存档属性集的文件
/M 仅复制具有存档属性的文件并重置存档属性
/IA:[RASHCNETO] 仅包含具有任意给定属性集的文件
/XA:[RASHCNETO] 排除具有任意给定属性集的文件
/XF 文件[文件]… 排除与给定名称/路径/通配符匹配的文件
/XD 目录[目录]… 排除与给定名称/路径匹配的目录
/XC 排除已更改的文件
/XN 排除较新的文件
/XO 排除较旧的文件
/XX 排除多余的文件和目录
/XL 排除孤立的文件和目录
/IS 包含相同文件
/IT 包含已调整的文件
/MAX:n 最大的文件大小 – 排除大于 n 字节的文件
/MIN:n 最小的文件大小 – 排除小于 n 字节的文件
/MAXAGE:n 最长的文件存在时间 – 排除早于 n 天/日期的文件
/MINAGE:n 最短的文件存在时间 – 排除晚于 n 天/日期的文件
/MAXLAD:n 最大的最后访问日期 – 排除自 n 以来未使用的文件
/MINLAD:n 最小的最后访问日期 – 排除自 n 以来使用的文件
(If n < 1900 then n = n days, else n = YYYYMMDD date)
/XJ 排除接合点(默认情况下通常包括)
/FFT 假设 FAT 文件时间(2 秒粒度)
/DST 弥补 1 小时的 DST 时间差
/XJD 排除目录的接合点
/XJF 排除文件的接合点

重试参数

/R:n 失败副本的重试次数: 默认为 1 百万
/W:n 两次重试间的等待时间: 默认为 30 秒
/REG 将注册表中的 /R:n 和 /W:n 保存为默认设置
/TBD 等待定义共享名称(重试错误 67)

日志记录参数

/L 仅列出 – 不复制、添加时间戳或删除任何文件
/X 报告所有多余的文件,而不只是选中的文件
/V 生成详细输出,同时显示跳过的文件
/TS 在输出中包含源文件的时间戳
/FP 在输出中包含文件的完整路径名称
/BYTES 以字节打印大小
/NS 无大小 – 不记录文件大小
/NC 无类别 – 不记录文件类别
/NFL 无文件列表 – 不记录文件名
/NDL 无目录列表 – 不记录目录名称
/NP 无进度 – 不显示已复制的百分比
/ETA 显示复制文件的预期到达时间
/LOG:文件 将状态输出到日志文件(覆盖现有日志)
/LOG+:文件 将状态输出到日志文件(附加到现有日志中)
/UNILOG:文件 以 UNICODE 方式将状态输出到日志文件(覆盖现有日志)
/UNILOG+:文件 以 UNICODE 方式将状态输出到日志文件(附加到现有日志中)
/TEE 输出到控制台窗口和日志文件
/NJH 没有作业标头
/NJS 没有作业摘要
/UNICODE 以 UNICODE 方式输出状态

作业参数

/JOB 从命名的作业文件中提取参数
/SAVE 将参数保存到命名的作业文件
/QUIT 处理命令行后退出(以查看参数)
/NOSD 未指定源目录
/NODD 未指定目标目录
/IF 包含以下文件

 


具体的应用实例请参见本系列文章:

随心所欲玩复制 详解robocopy (一)

随心所欲玩复制 详解robocopy (二)

随心所欲玩复制 详解robocopy (三)

随心所欲玩复制 详解robocopy (四)

本文出自 “马睿的技术博客” 博客,请务必保留此出处http://marui.blog.51cto.com/1034148/300470

随心所欲玩复制 详解robocopy:目前有1 条留言

发表评论


快捷键:Ctrl+Enter