批处理/bat一次复制文件夹和内容

63
我正在编写一个批处理脚本来执行复制操作。我想要将它编写成能够复制整个文件夹的脚本。当我要复制单个文件时,可以这样做:
copy %~dp0file.txt file.txt 

如果我有这样一个结构的文件夹,是否有一条命令可以一次性复制整个文件夹及其所有内容并保持完全相同的结构。

mainfolder/
  file1.txt
  file2.txt
  insidefolder/
     file3.txt
     file4.txt 
     file5.txt
5个回答

76

如果你有xcopy,可以使用/E参数,它将复制目录和子目录以及其中的文件,包括保留空目录的目录结构。

xcopy [source] [destination] /E

7
如果您希望包括隐藏文件,并且不想被询问确认,您可以使用以下命令: xcopy [源路径] [目标路径] /E /H /C /R /Q /Y 请使用 xcopy /? 命令查看这些选项的含义。 - lucaferrario
由于某种原因,这并没有为我复制父目录中的所有文件。 - Jonathan
15
xcopy 已经过时,当文件名超过 254 个字符时,会引发“内存不足”的错误。请使用 robocopy 替代:robocopy C:\source D:\destination /COPYALL /E。详见 https://en.wikipedia.org/wiki/Robocopy。 - Marco Demaio

54

旧的方式:

xcopy [source] [destination] /E

xcopy已被弃用。Robocopy取代了Xcopy。它与Windows 8、8.1和10一起提供。

robocopy [source] [destination] /E

Robocopy 有几个优点:

  • 复制超过259个字符的路径
  • 多线程复制

更多细节请看这里


3
我在Windows 7上测试了 robocopy /? 命令,它也支持该命令。 - duXing
如果您想要删除目标目录中不存在于源目录中的文件,请在 robocopy 命令中使用 /MIR 参数。 - Jordan

7
我怀疑xcopy命令是您正在寻找的法宝。它可以复制文件、目录甚至整个驱动器,同时保留原始目录层次结构。与基本的copy命令相比,还有一些额外的选项可用。请参阅此处的文档。
如果您的批处理文件只需要在Windows Vista或更高版本上运行,则可以使用robocopy,这比xcopy更强大,并且现在内置于操作系统中。它的文档可在此处找到。

3

对于文件夹复制,您可以使用以下方法

robocopy C:\Source D:\Destination /E

文件复制操作

copy D:\Sourcefile.txt D:\backup\Destinationfile.txt /Y 

删除某个文件夹中最后修改日期早于指定天数的文件

forfiles -p "D:\FolderPath" -s -m *.[Filetype eg-->.txt] -d -[Numberof dates] -c "cmd /c del @PATH"

你可以在Windows中安排任务,在特定时间自动执行此任务。


1

我对这个问题和相关问题很感兴趣。

为了回答这个问题,本周我进行了一些与XCOPY相关的实验。

为了帮助回答原始问题,我在此发布我的实验结果。

我在Windows 7 64位专业版SP1上进行了实验,并使用了操作系统自带的XCOPY副本。

为了进行实验,我使用了脚本语言Open Object Rexx和编辑器宏语言Kexx以及文本编辑器KEdit编写了一些代码。

XCOPY是从Rexx代码中调用的。 Kexx代码编辑了XCOPY的屏幕输出,以便关注关键结果。

这些实验都涉及使用XCOPY复制一个具有多个文件和子目录的目录。

实验包括10个案例。每个案例都调整了XCOPY的参数并调用了一次XCOPY。所有10个案例都试图执行相同的复制操作。

以下是主要结果:

(1)在10个案例中,只有三个进行了复制。另外7个案例立即在处理XCOPY参数时给出了错误消息,例如:

Invalid path

Access denied

没有复制任何文件。

在三个进行复制的案例中,它们都执行了相同的复制操作,也就是说,得到了相同的结果。

(2) 如果想要复制目录X以及目录X下所有的文件和子目录,那么显然XCOPY并不能做到这一点。这似乎也是最初的问题所在。

其中一个后果是,如果使用XCOPY复制目录X及其内容,则可以复制内容,但无法复制目录X本身;因此会失去目录X的时间日期戳、归档位、所有权数据、属性等信息。

当然,如果目录X是目录Y的子目录,则对目录Y进行XCOPY将复制目录Y的所有内容,包括目录X。因此可以得到目录X的副本。但是,目录X的副本将具有XCOPY运行时的时间日期戳,而不是原始目录X的时间日期戳。

这种时间戳的更改可能对带有许多下载网页的目录副本造成不便:Web页面的HTML文件将保留其原始时间戳,但是由HTML文件使用的文件的相应子目录将具有XCOPY运行的时间戳。因此,在按时间日期戳对副本进行排序时,所有子目录、HTML文件和相应的子目录(例如)都将被包括在内。
x.htm

x_files

这句话的意思是,在时间和日期排序中,可能会出现很大的差距。

分层文件系统早在 1969 年 MIT 的 Multics 中就有了,并且自那时起,许多人已经认识到了两种情况,即给定目录 X,(i) 复制目录 X 及其所有内容和 (ii) 复制 X 的所有内容,但不复制目录 X 本身。经过实验,XCOPY 只执行了(ii)操作。

因此,10 个案例的结果如下。对于每种情况,在结果中的前三行都是 XCOPY 的前三个参数。因此,第一行显示要复制的目录名称(源目录);第二行显示要将副本放置的目录名称(目标目录),第三行为 XCOPY 的选项。剩余的 1-2 行显示 XCOPY 运行的结果。

关于选项的一个重要点是选项 /X 和 /O 会产生结果。

Access denied

要看到这一点,请将第8个案例与其他相同的案例进行比较,这些案例没有/X和/O,但进行了复制。

这些实验让我更好地理解了XCOPY,并对最初的问题做出了贡献。

======= case 1 ==================
"k:\software\dir_time-date\"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_1\"
options = /E /F /G /H /K /O /R /V /X /Y
Result:  Invalid path
Result:  0 File(s) copied
======= case 2 ==================
"k:\software\dir_time-date\*"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_2\"
options = /E /F /G /H /K /O /R /V /X /Y
Result:  Access denied
Result:  0 File(s) copied
======= case 3 ==================
"k:\software\dir_time-date"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_3\"
options = /E /F /G /H /K /O /R /V /X /Y
Result:  Access denied
Result:  0 File(s) copied
======= case 4 ==================
"k:\software\dir_time-date\"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_4\"
options = /E /F /G /H /K /R /V /Y
Result:  Invalid path
Result:  0 File(s) copied
======= case 5 ==================
"k:\software\dir_time-date\"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_5\"
options = /E /F /G /H /K /O /R /S /X /Y
Result:  Invalid path
Result:  0 File(s) copied
======= case 6 ==================
"k:\software\dir_time-date"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_6\"
options = /E /F /G /H /I /K /O /R /S /X /Y
Result:  Access denied
Result:  0 File(s) copied
======= case 7 ==================
"k:\software\dir_time-date"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_7"
options = /E /F /G /H /I /K /R /S /Y
Result:  20 File(s) copied
======= case 8 ==================
"k:\software\dir_time-date"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_8"
options = /E /F /G /H /I /K /O /R /S /X /Y
Result:  Access denied
Result:  0 File(s) copied
======= case 9 ==================
"k:\software\dir_time-date"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_9"
options = /I /S
Result:  20 File(s) copied
======= case 10 ==================
"k:\software\dir_time-date"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_10"
options = /E /I /S
Result:  20 File(s) copied

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接