批处理文件将文件从一个文件夹复制到另一个文件夹

291

我在网络上有一个存储文件夹,所有用户都会将他们的活动数据存储在服务器上。现在由于位置问题,该服务器将被替换为新服务器,因此我需要将旧服务器存储文件夹中的子文件夹文件复制到新服务器存储文件夹中。我有以下示例:

\Oldeserver\storage\data & files\New server\storage\data & files


3
你是指 Windows 环境吧? - Alan Plum
4
@HugoM.Zuleta,我知道.bat文件。但是,“批处理文件”并不一定保证是Windows环境。该术语的使用早于Windows(.bat文件也是如此),我甚至看到新手将该术语用于表示*nix环境中的“shell脚本”。 - Alan Plum
1
@pluma 我同意,这主要是因为它们指的是由操作系统脚本工具执行的批处理操作。 - Hugo M. Zuleta
11个回答

516

xcopy.exe 肯定对你有帮助,而且它已经内置在Windows中,所以它不需要任何费用。

只需要输入 xcopy /s c:\source d:\target

你可能需要调整一些选项,我们也会添加一些选项来进行调整:

  • /s/e - 递归复制,包括复制空目录。
  • /v - 添加此选项可将副本与原始文件进行验证。速度较慢,但对于偏执者而言是必要的。
  • /h - 复制系统和隐藏文件。
  • /k - 复制只读属性以及文件。否则,所有文件都会变为可读写。
  • /x - 如果你关心权限,你可能需要 /o/x
  • /y - 不提示覆盖现有文件。
  • /z - 如果你认为复制可能会失败,并且想要重新开始,可以使用此选项。它在复制每个文件时放置一个标记,因此您可以重新运行 xcopy 命令从停止的地方继续。

如果你认为 xcopy 可能会在中途失败(例如在复制过程中出现网络故障),或者你必须停止并希望以后继续复制,可以使用 xcopy /s/z c:\source d:\target


2
@Iavinio 在复制档案时会询问文件或目录。有没有办法抑制这个提示? - Bitterblue
2
/i - 如果目标不存在且复制多个文件,则假定目标必须是一个目录。 - lavinio
1
如何从目录中复制单个文件? - Charan Raju C R
17
为了避免“文件或目录”提示,可以使用以下命令... echo f | xcopy /s /f 源文件 目标文件 - wintondeshong
如果您不想受到xcopy有关复制文件或目录的问题的骚扰,只需在要默认复制为文件的文件末尾添加*(另外,/y用于覆盖目标),即可解决。xcopy /Y C:\file.txt C:\myfold\file.txt* - linsock
显示剩余4条评论

82

我最喜欢的备份数据工具是:

ROBOCOPY "C:\folder" "C:\new_folder" /mir

/mir是用于镜像的。您还可以使用/mov来移动文件。它会复制完全相同的文件夹。必要时它可以删除/覆盖文件。对我来说效果非常好。它比xcopy/copy快得多。它也是Windows内置的。

来源: http://technet.microsoft.com/en-us/library/cc733145.aspx


3
我支持这个。速度真的很快,比xcopy快得多。 - Ike
有没有类似于这样递归删除thumbs.db的方法? - drooh
正是我正在寻找的东西。它可以精确地从源目录复制所有子文件夹和文件。 - Rahul

58

只是为了明确,当您使用xcopy /s c:\source d:\target命令时,请将""放在c:\source和d:\target周围,否则会出现错误。

即如果路径中有空格,例如:

"C:\Some Folder\*.txt"

但如果你有以下条件,则无需此项要求:

C:\SomeFolder\*.txt

1
引号起了作用 ;) 谢谢 我还使用了 /Y 来替换文件(如果存在) :) 示例:´´´xcopy /s "c:\source" "d:\target" /Y``` - Joel Carneiro

18

为了避免在使用xcopy时弹出“在目标上指定文件名或目录名(F =文件,D =目录)?”提示框,您可以执行以下操作...

echo f | xcopy /f /y 源文件 目标文件

或者对于我们只是复制大型子结构/文件夹的人:

使用/i指定如果复制多个文件,则目标必须是一个目录。


(回显“f”表示文件或“D”表示目录) - JinSnow
尝试现在做这个,但它就是不起作用 - 当我试图将一个文件复制到另一个目录时,我总是得到提示。如果使用Win 10会影响它的话。echo f | xcopy /f /y "My.dll" "C:\myFolder\My.dll"。我已经尝试了其他开关的组合,但都没有成功(并且大写F)。 - friartuck

17

你可能想要查看 XCopy 或者 RoboCopy,它们是 Windows 上几乎所有文件复制操作的全面解决方案。


3
RoboCopy似乎比XCopy更好,因为XCopy需要文件或文件夹决策。而且我无法关闭它,必须能够完全自动化工作。 - Bitterblue
@mini-me 我知道这已经很晚了,但我找不到相同的相关开关。最终我只能让它创建一个与我要复制的文件同名的空白文件,然后覆盖它。如果文件已经存在,则不会询问它是文件还是目录。(如果您想要自动目录,则可以在路径末尾添加 '/',它就会自动创建)。希望这对未来的人有所帮助! - Tom C
2
@Eve 参考:echo f | xcopy source destination /y 将使其自动化。它将为所有问题分配“f”作为响应。它还将传递覆盖请求(我认为f被视为是yes)。 - ndm13
xcopy和robocopy之间的区别 - djvg

11
如果您想复制文件而不使用绝对路径,也就是相对路径:
不要忘记在路径中写反斜杠而不是正斜杠。
例如:
copy children-folder\file.something .\other-children-folder

注意:使用称为“批处理参数”的通配符可以检索绝对路径。

@echo off
echo %%~dp0 is "%~dp0"
echo %%0 is "%0"
echo %%~dpnx0 is "%~dpnx0"
echo %%~f1 is "%~f1"
echo %%~dp0%%~1 is "%~dp0%~1"

点击此处查看有关复制的文档:https://technet.microsoft.com/zh-cn/library/bb490886.aspx

还可以在此处查看有关批处理参数的文档: https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/zh-cn/percent.mspx?mfr=true


我认为 \ 被称为反斜杠。 - Leon Bohmann

4
@echo off

rem The * at the end of the destination file is to avoid File/Directory Internal Question.

rem You can do this for each especific file. (Make sure you already have permissions to the path)
xcopy /Y "\\Oldeserver\storage\data\MyFile01.txt" "\\New server\storage\data\MyFile01.txt"*
pause

rem You can use "copy" instead of "xcopy "for this example.

1
你可以使用 esentutl 复制(主要是大)文件,并带有进度条:
esentutl /y "my.file" /d "another.file" /o

进度条看起来像这样:

enter image description here


0

看看基于rsync的Windows工具NASBackup。如果你熟悉rsync命令,那就更好了。


-1
如果您可以使用Bash,则可以使用以下带有递归选项的命令。
cp -r "C:\Users\sourceFolder\." "C:\Users\destinationFolder"

这将复制位于sourceFolder下的所有文件和文件夹到destincationFolder中。


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