在Windows下我们使用复制、粘贴来拷贝一些文件或文件夹。在MS-DOS或批处理中,copy是复制、拷贝的意思,是一个内部命令,不需要任何程序来运行。
copy的作用是备份文件,合并文件,更新文件,或者将文件从一个位置复制到另一个位置
用法相对简单,copy命令针对的是文件,不是文件夹,支持通配符和UNC。
首先还是看下语法:

1.复制
单文件复制
1>.首先copy需要有目标位置或文件,否则不能进行下去。也就是copy文件不能copy到自身。
这里说的目标位置一定是一个不同于源位置的位置。
例1就是源位置和目标位置一样,就不能copy。
例2是copy当前文件夹下665文件夹里的所有文件到当前目录(也就是temp目录下)。
例3是123.txt从C盘根目录copy到d盘根目录了。
例1:
C:\>copy install*.log
installAgent.log
The file cannot be copied onto itself.
0 file(s) copied.
例2:
C:\Temp>copy 665 或 C:\Temp>copy .\665
665\rty.txt
1 file(s) copied.
C:\Temp>copy .\665
例3:
C:\copy c:\123.txt d:\
C:\123.txt
1 file(s) copied.
2>.如果路径含有空格或特殊字符,需要加引号。
例:
copy "C:\my work\new file.doc" "D:\New docs"
3>.如果要copy到的位置,目标目录不存在。文件将被copy到该位置,同指定目录同名的文件中。
例:temp目录下将出现一个998的文件,内容同于rty.txt。
C:\Temp>copy rty.txt c:\temp\998
1 file(s) copied.
多文件复制
多文件复制一般是针对本地或UNC局域网络目录下的所有文件,或使用通配符*,?等指定一些具有某些特征的文件进行复制。
1>.复制一个目录下的文件到另一个目录下
例1,
copy c:\123 d:\abc
将c:\123 目录中所有文件复制到d:\abc目录中.
例2,
copy c:\123\*.txt d:\abc /y
将c:\123目录中所有txt格式的文件复制到d:\abc目录中,当目标目录中已经存在了和源目录中要复制的同名文件时,就会出现如“覆盖x:\xx吗?(Yes/No/All):”这样的提示,让你选择是覆盖、不覆盖还是全部覆盖,
通过参数/y(复制单个文件或批量复制时皆可使用),可以实现重名文件无须确认直接覆盖。
例3,
UNC结合通配符copy的例子
copy \\network\sharefolder\*.xlsx C:\ttc\Bcopy
2.重命名
上面单文件复制的例3实际是一个文件重命名的例子。前面我们讲move的命令时,也有重命名的功能,另外ren(rename)也具有重命名的作用。那么它们有什么区别呢?
1>.copy是复制文件的命令,它的重命名只能针对文件,而且不会删除原文件。
例:
copy c:\a.txt c:\b.txt 会在c盘根目录下创建一个名为b.txt的新文件,内容和a.txt一样,但是a.txt仍然存在。
2>.move是移动文件或文件夹的命令,它的重命名可以是文件或文件夹,不管是覆盖还是移动,本质上会删除原文件或文件夹(尽管重命名本身,感觉上只是改了个名字)
例:
move a.txt b.docx 会将a.txt重命名为b.docx,并且删除a.txt。
move c:\123 c:\77,则是把123移动到C盘根目录,同时重命名为77(前提:C盘根目录下之前没有77这个目录)
move c:\123 c:\77.txt,你以为是什么呢,只是把123这个文件夹改了个名字为77.txt(前提:C盘根目录下之前没有77.txt这个文件或目录)。
思考:如果有77这个目录,或77.txt这个目录或文件,结果将会怎样呢?
3>.ren是重命名文件或文件夹的命令,它可以将一个或多个文件或文件夹的名称修改为新的名称,但是不会改变它们的位置(本质上会删除原文件或文件夹)。
例:
ren a.txt b.txt 也会将a.txt重命名为b.txt,并且删除a.txt。
ren c:\abc\ xyz 会将c盘下的abc文件夹重命名为xyz,并且删除原文件夹。
4>.copy可以使用通配符*和?(源和目标均可以使用)来批量复制或重命名文件,ren支持文件名更改前后使用通配符,move只支持源使用通配符,不支持目标使用通配符。
copy不能复制隐藏属性或系统属性的文件,需要先去掉这些属性,而move可以直接移动这些文件。
ren不能重命名隐藏属性或系统属性的文件,需要先去掉这些属性。
move文件夹对目标文件夹有保护性动作,遇到同名目录移动会拒绝访问,对同名文件则会提示是否覆盖。
ren遇到同名文件,会提示已有同名文件,不能执行重命名;为避免冲突,Windows下会建议你命名为另一个不同的名字(鼠标操作)。
copy遇到同名文件,会提示是否覆盖,加参数/y,可以不用提示直接覆盖。
copy支持通配符,你可以使用*和?来匹配多个文件(*匹配多个字符,?匹配单个字符)。
例如,如果你要复制当前目录下的所有txt文件,你可以使用这样的命令:
copy *.txt d:\
这样就会把所有以.txt结尾的文件复制到d盘根目录下。如果你要复制当前目录下的所有以a开头的文件,你可以使用这样的命令:
copy a* d:\
这样就会把所有以a开头的文件复制到d盘根目录下。如果你要复制当前目录下的所有长度为3个字符的文件,你可以使用这样的命令:
copy ??? d:\
这样就会把所有长度为3个字符的文件复制到d盘根目录下。
实践下面的例子,体验通配符*和?的区别:
C:\Temp>copy *ty.txt *Uy.txt
rty.txt
1 file(s) copied.
C:\Temp>copy *ty.txt ?Uy.txt
rty.txt
1 file(s) copied.
3.追加或合并
你可以使用批处理copy来合并多个文件为一个文件,具体的格式为:copy 文件1+文件2+文件3+…… 目的路径\新文件名。
例如,如果你要把d:\test.txt和d:\abc.txt两个文件的内容合并为d:\test\test.txt,你可以使用这样的命令12:
copy d:\test.txt+d:\abc.txt d:\test\test.txt
你也可以使用通配符来合并同一目录下的所有文件,例如:
copy *.txt merge.txt
这样就会把当前目录下的所有txt文件合并为merge.txt3。
copy /b d:\1.mp3+d:\2.mp3 e:\3.mp3
这样就会把1.mp3和2.mp3合并成3.mp3。
copy /b d:\1.txt d:\2.mp3
这样就会把1.txt和2.mp3合并,这里没有指定合成后的文件名,默认情况下,合并后的文件名是命令中的第一个文件的名。
在这里,即把2.mp3合并进了1.txt。
注意:合并图片/歌曲这样的二进制文件必须使用/b参数(b代表Binary,二进制),否则合并将会失败;另一个合并参数是/a
(a代表ASCII,文本文件),只能用于纯文本的合并。两参数不能同时使用,二进制方式可以合并文本和二进制文件,而文本方式则只能合并文本。
要在不修改文件的情况下为文件分配当前时间和日期,请使用以下语法:
copy /b <source> +,,
如copy /b 33.txt +,,
其中的逗号表示有意省略了目标参数。
4.一些特殊应用
1>.创建一个空文件(0字节文件)
copy nul emptyfile.txt
2>.静默拷贝(屏幕上没有反馈)
copy source_file.doc newfile.doc >nul
3>.从控制台复制(接收用户输入)
COPY CON filename.txt
执行该命令后从键盘输入字符,按Ctrl+Z结束,然后回车就copy了一个自己输入内容创建的文本文件。
copy和xcopy的区别:
1>.copy是DOS内部命令,xcopy是DOS外部命令,xcopy stands for extended copy,即copy在任何存在DOS的环境下都可以使用,而xcopy则需要system32文件夹或批处理当前目录存在xcopy.exe文件才可运行。
2>.copy只针对文件,不针对文件夹,而xcopy则可以复制文件和目录树,包括空目录和子目录。
3>.copy命令能合并两个文件,而xcopy不能。
4>.copy不能复制隐藏属性或系统属性的文件,而xcopy有更丰富的参数,可以根据文件的属性,日期,大小等条件来选择性地复制文件,也可以复制隐藏文件和系统文件,覆盖只读文件,复制加密文件等。