使用Xcopy复制文件和文件夹的终极指南

工具:Xcopy,全称为扩展复制工具,是用于在Windows中复制大量数据的流行命令行实用程序。与传统的copy命令相比,Xcopy具有更多功能和开关,使您在复制或移动文件和文件夹时具有更好的控制能力。

在本指南中,您将学习如何在各种文件复制场景中使用Xcopy。从复制单个文件、多个目录,应用过滤器或排除项等。到最后,您将掌握在日常文件复制任务中使用Xcopy的知识。

让我们开始吧!

先决条件

要按照本指南中的示例操作,您需要以下内容。

  • A Windows (server or client) computer. Xcopy comes built-in to Windows, and you don’t need to download anything else. This guide will use Windows 10 Build 1909.
  • Xcopy适用于命令提示符或PowerShell,并且本文假定您已经打开了其中一个。

了解Xcopy命令

Xcopy是一个命令行实用程序,自Windows 98以来就已经预装。您可以在%WINDIR%\system32文件夹下找到这个工具,可执行文件名为xcopy.exe

与Windows copy命令相比,Xcopy在复制文件和目录方面更加高效。此外,Xcopy具有更多选项,使其更具可定制性,可以控制文件复制行为。

优势

Xcopy 的使用有几个好处或优势,在本指南中您将学到。但以下是使用 Xcopy 的一些好处。

  • 在大量文件和目录上更快的复制操作。
  • 简化应用程序部署
  • 可以复制源目录结构。
  • 复制文件同时保留所有者和访问控制列表(ACL)信息。
  • 复制并覆盖只读文件。
  • 可以根据文件名、扩展名或路径排除文件。
  • 可以识别更新的文件,这对于差异备份非常有用。
  • 与脚本集成并使用。

限制

尽管 Xcopy 很棒,但它也有局限性。虽然这些限制可能不是致命的,但在深入了解之前了解它们是好的。

  • 无法复制打开的文件。
  • 不支持Windows 卷影复制服务(VSS)。这种缺乏 VSS 支持使得 Xcopy 不适用于备份活动的操作系统卷。
  • 当路径加文件名的长度超过 254 个字符时会出现内存不足错误。

Xcopy 语法参考

Xcopy允许您执行各种文件和文件夹复制操作。但首先,您需要了解其语法和选项。有许多选项可以更改Xcopy的操作方式。为了帮助您理解这些选项,接下来的表格将详细介绍它们。

第一个路径指定是源文件;第二个路径指定是目标文件。

xcopy [source] [destination] [options]
  • [源] – 要复制的文件的路径(支持通配符)。您应该指定驱动器、路径和要复制的文件。
  • [目标] – 新文件的路径。如果您不指定目标路径,该命令将把文件复制到与源文件相同的路径。
  • [选项] – 可以是下表中的任何选项。您还可以通过运行xcopy /?命令或访问Xcopy在线文档来查看这些选项。

源选项

Switch Explanation
/A Copy files that have the archive attribute.
/M Copy files with the archive attribute set, then switches off the archive attribute at the destination. Use this option when creating routine backups.
/H Copy hidden and system files and directories. The default value is N.
/D:mm-dd-yyyy Only copies that files with modification date on or after the given date. Without using this option, the command will copy only the files whose date/time is newer than the destination.
/U Only copies the files that already exists at the destination.
/S Copies folders and subfolders recursively excluding the empty one.
/E Copies folders and subfolders recursively including the empty one.
/EXCLUDE:file1[+file2][+file3]… Specify the text file(s) containing a list of strings to match absolute file paths to exclude.

目标选项

Switch Explanation
/I If the destination does not exist, using this option assumes that the destination is a directory and creates it. If you omit this option, the command prompts to confirm if the destination is a directory or a file.
/R Overwrites read-only files.
/T Creates a recursive folder structure at the destination without copying the files. This option does not include copying empty folders. To include empty folders, use this option together with the /E option.
/K Preserves the file attributes during the copy. Otherwise, the command will reset read-only attributes.
/N Copies files using their short file names.
/O Copies files including ownership and access control list (ACL) information.
/X Copies files including file audit settings and ACL information (implies using /O).

复制选项

Switch Explanation
/W Prompts for a key press before the copy process can start.
/P Prompts (Y/N) before creating each file.
/Y Suppresses the confirmation to overwrite destination file if exists.
/-Y Prompts to confirm overwriting an existing destination file.
/V Verifies that the source and destination file sizes are identical.
/C Ignores errors and forces the command to continue copying.
/B Copies only the symbolic link but not the link target file.
/G Copies encrypted files to a destination that does not support encryption.
/J Copies files without using the buffer. This switch useful when copying very large files.
/Q Suppresses the display of file names while copying.
/F Displays the full source and destination file paths while copying.
/L Only displays which files to copy without copying them. This switch can be useful when testing Xcopy commands with multiple options to assess the expected result.
/Z Copies files in restartable mode. Using this option, the command gracefully stops copying files during network interruption. The copying will resume after re-estabslishing the network connection.

使用Xcopy:使用示例

现在您已经熟悉了Xcopy的语法和选项,是时候开始通过组合一个或多个选项来实际使用它了。在以下部分中,您将探讨使用Xcopy复制文件和文件夹的许多不同情境。

列出要复制的文件

如果您有一个包含大量文件的文件服务器,您想要复制这些文件,也许是到备份位置,最好先测试一下您的 Xcopy 命令。您想要测试 Xcopy 的情况之一是当您需要组合多个 Xcopy 选项时。

使用 Xcopy 的 /L 开关,您可以模拟当您发出命令时会发生什么,列出它将复制哪些文件。这样,您可以确认您的命令是否会复制您打算复制的所有文件。

XCOPY C:\Workarea\XCopyDemo C:\Workarea\XCopyDemoFolder /L

复制单个文件

您可以使用 Xcopy 执行的最基本操作是从源到目标复制文件,而不使用任何选项。例如,下面的命令将文件从源复制到目标目录,并且文件名将保持不变。

XCOPY C:\Workarea\XCopyDemo\NewFile.txt C:\Workarea\XCopyDemoFolder

您还可以通过运行下面的命令复制源文件并更改目标文件名。

XCOPY C:\Workarea\XCopyDemo\NewFile.txt C:\Workarea\XCopyDemoFolder\AnotherFile.txt

复制文件到新文件夹

使用 Xcopy,您可以复制文件并即时创建目标目录。为此,您需要将 /I 选项附加到 Xcopy 命令。

例如,下面的命令将文件从 C:\Workarea\Demo 文件夹复制到 D:\Workarea 文件夹。如果目标文件夹不存在,Xcopy 将使用 /I 选项创建目标文件夹。

XCOPY C:\Workarea\Demo D:\Workarea /I

递归复制所有文件和文件夹

除了从一个文件夹复制文件到另一个文件夹外,Xcopy 还允许您递归复制文件夹和文件。而且有两种方法可以进行递归复制——包括和不包括空文件夹。

将所有文件和目录复制到另一个位置,同时忽略空目录,请在Xcopy命令的末尾添加/S选项,如下所示。

XCOPY C: D: /S

另一方面,要在递归复制过程中包括空目录,请改为添加/E选项到命令中。

XCOPY C: D: /E

包括隐藏和系统文件

默认情况下,Xcopy在复制操作中不包括隐藏和系统文件。但如果需要强制Xcopy包括隐藏和系统文件,请在命令中添加/H开关。

下面的命令递归复制所有文件,包括隐藏和系统文件。此命令还会忽略错误,创建目标文件夹,并覆盖现有文件。

XCOPY C:\Workarea\Documents D:\Workarea\Documents /S /H /C /Y

保留只读文件属性

Xcopy还可以处理和保留的另一个属性是文件的只读属性。默认情况下,当Xcopy复制只读文件时,它会在目标位置删除文件的只读属性。要阻止Xcopy删除只读属性,请在命令中添加/K开关。

例如,下面的命令将只读文件复制到另一个位置,结果目标文件仍将具有只读属性。此命令还将覆盖目标文件(如果文件已存在)。

XCOPY C:\Workarea\XCopyDemo\NewFile.txt D:\Workarea /I /K /Y

作为保留文件为只读的副作用,Xcopy不能在未来的复制操作中覆盖相同的文件。但是,您可以通过添加/R开关来强制Xcopy覆盖只读文件。

XCOPY C:\Workarea\XCopyDemo\NewFile.txt D:\Workarea /K /R /Y

筛选要复制的文件

假设源文件夹和子文件夹中有多个文件需要复制。Xcopy允许您输入通配符来过滤要复制的文件。

例如,下面的命令会从C:驱动器的根目录递归地仅复制扩展名为.cs的文件到E:驱动器的根目录。此命令还会忽略错误,并在不提示确认的情况下覆盖现有文件。

XCOPY C:\*.cs E:\ /S /C /Y

排除复制的文件和文件夹

A powerful feature of Xcopy is its ability to exclude files from the copy process. To use this feature, you can leverage the /EXCLUDE switch. This switch accepts the names of the file(s) that contain the exclusion lists.

首先,您需要创建或拥有一个包含排除列表的文件。例如,您可以有一个名为Exclude.txt的文本文件,其中包含以下条目。正如您所看到的,排除文件可以具有特定的文件名、文件扩展名和文件夹作为条目。

xyz.txt
Exclude.txt
.pdf
.png
\exclude\

要使用排除项运行Xcopy,请运行下面的命令,并指定排除文件的完整路径到/EXCLUDE开关。此命令使用C:\Workarea\XCopyDemo\Exclude.txt文件。

XCOPY C:\Workarea\XCopyDemo C:\Workarea\Backup /S /Y /Exclude:C:\Workarea\XCopyDemo\Exclude.txt

结果呢?Xcopy运行以复制文件,但跳过了xyz.txtExclude.txt、所有扩展名为.pdf.png的文件,以及exclude目录下的所有文件。

执行差异备份

当您需要从一个位置备份文件到另一个位置时,Xcopy具有一个选项,允许您执行差异备份。差异备份不会复制所有文件,而是仅复制修改日期等于或晚于您指定的日期的文件到/D:m-d-y开关。

例如,要复制修改日期在2021年4月1日或之后的文件,请运行以下命令。此外,此命令执行递归复制,忽略错误,并覆盖目标位置上现有的文件。

XCOPY C:\Workarea\XCopyDemo C:\Workarea\Backup /D:04-01-2021 /S /C /Y

如果您没有使用/D选项指定日期,Xcopy 将仅复制比目标文件更新的源文件。

基于存档属性复制文件

通常,在备份操作后,备份程序会删除文件的存档属性。在修改文件(即编辑并保存)后,Windows 会自动重置文件的存档属性。

如果您创建了一个使用 Xcopy 备份文件的脚本,您可以使用存档属性来确定是复制还是备份文件。

要复制具有存档属性的文件,您可以利用/A/M开关。选择使用哪个开关取决于您是否要保留文件的存档属性。

以下命令仅执行具有存档属性的文件的递归复制。由于/A开关,目标文件在复制后将保留存档属性。

XCOPY C:\Workarea\Demo D:\Workarea\Test /A /S /Y

相比之下,要在复制到目标后删除源文件的存档属性,请指定/M开关。

XCOPY C:\Workarea\Demo D:\Workarea\Test /M /S /Y

保留文件所有者和 ACL 信息

想象一下创建整个个人资料文件夹的备份。每个文件可能有不同的所有者或独特的权限。如果您需要恢复这些文件,您会希望保留相同的所有者和权限。

这样,整个过程看起来就像是无缝的,用户仍然会像以前一样访问文件。但首先,您需要确保在备份这些文件时保留现有的所有者和访问权限。

要复制文件并保留所有者和 ACL 信息,请将 /O 参数添加到 xcopy 命令中,如下所示。

XCOPY C:\Workarea D:\Work /O /I /Y

除了保留所有者和 ACL 信息之外,您还可以包括文件的审计设置。

使用 Xcopy 复制文件时要包括文件审计设置,可以使用 /X 开关。 /X 开关也意味着同时使用 /O 开关,因此您不必同时使用这两个开关。

XCOPY C:\Workarea D:\Work /X /I /Y

在网络上复制文件和文件夹

Xcopy不仅可以在同一或不同磁盘上的位置之间复制文件,还可以在网络上复制文件。不幸的是,在网络上复制文件并不总是可靠的。网络连接可能会遭受短暂中断,并且在某些情况下可能完全丢失连接。

幸运的是,您可以以可重新启动的模式运行Xcopy。这意味着,即使由于网络错误而导致复制进度停止,也可以在重新建立网络连接后恢复复制。要以可重新启动的模式运行Xcopy,您需要在命令中添加/Z开关。

例如,下面的命令从C:\Workarea文件夹递归地复制文件到网络位置。/Z参数使Xcopy在可重新启动的模式下运行。

XCOPY C:\Workarea "\\SERVER01\Backup" /S /Z

使用/Z开关,Xcopy还会显示文件复制进度的百分比。

使用未缓冲I/O复制文件

缓冲I/O对应于操作系统如何在文件系统缓存中缓冲磁盘读取和写入。虽然缓冲可以加快对同一文件的后续读取和写入,但代价是很高的。因此,未缓冲I/O(或原始文件复制)是复制大文件的首选方法。

这种复制方法减少了文件系统缓存开销,并防止文件系统缓存被大量文件数据轻松刷新。

要使用无缓冲I/O复制大文件,您可以在Xcopy命令中添加/J开关,如下所示。

XCOPY C:\Workarea\abc.mp4 D:\Temp /I /J

带验证复制文件

像其他任务一样,复制文件可能并不总是百分之百成功。即使没有可见错误,一些文件在传输过程中可能会损坏。

使用Xcopy,您可以使用/V开关根据复制后的大小验证目标和源文件是否相同。相同的源和目标文件表明复制成功,文件完好无损。

下面的命令将所有文件从C:\Workarea\XCopyDemo复制到C:\Workarea\Backup,并使用/V开关验证每个文件。/F开关显示源和目标文件的完整路径。

XCOPY C:\Workarea\XCopyDemo C:\Workarea\Backup /F /H /S /X /V

复制加密文件

Xcopy还支持将加密文件复制到不支持加密的目标位置。使用/G开关,Xcopy复制加密的源文件并创建解密的目标文件。

这种复制模式在将加密文件备份到网络共享或非加密文件系统(EFS)卷时特别有帮助。

Xcopy C:\Workarea\XCOPYDemo C:\Workarea\XCOPYDemoFolder /S /G

复制文件夹结构

在某些情况下,备份脚本或程序可能需要您在从源复制文件之前预先为目标进行配置。必要时,您可以使用 Xcopy 复制源文件夹结构而不复制内容。

为此,请使用带有 /T 开关的 Xcopy 命令。使用 /T 开关将导致 Xcopy 仅复制目录树结构到目标,但会忽略空目录。

您还可以将 /E 开关添加到命令中,以包含空目录,如下面示例命令所示。

Xcopy C:\Workarea\XCOPYDemo C:\Workarea\XCOPYDemoFolder /T /E

常见错误

如果事情能够出错,它很可能会出错。无论数据量大小,复制文件时情况都是如此。以下是您可能遇到的常见 Xcopy 错误。

无效的参数数量

此错误通常发生在您输入的命令中包含空格字符时。为避免此错误,在键入包含空格字符的源或目标路径时,应使用双引号将路径括起来。

例如,如果路径为 C:\Documents and Settings,则应输入路径为 “C:\Documents and Settings”。

无法执行循环复制

如果您正在复制的源目录也包括目标目录,则会发生此错误。在这种情况下,Xcopy 将进入循环,导致错误。在使用 Xcopy 时,如果要复制所有目录和子目录,则目标必须是一个完全独立的目录或磁盘。

解析错误

这个错误是由于在命令中输入了错误或无效的语法而引起的。例如,当您在路径中使用引号并且缺少结束引号时,就会遇到这个错误。

例如,下面的命令在目标路径中缺少了一个关闭双引号字符。

Xcopy C:\Workarea "C:\Workarea\XCopy Demo /S /I /E /Y

退出代码

Xcopy为操作返回一个退出代码,您可以使用它来确定操作是否成功。退出代码非常有用,特别是如果您的任务或脚本根据接收到的退出代码采取行动。

命令 shell 将退出代码保存在变量 %ErrorLevel% 中。然后,您的代码可以检查此变量的值以确定 Xcopy 操作的结果。

下面是列出所有 Xcopy 退出代码的表格。

Exit Code Purpose
0 This exit code means that there were no errors.
1 This exit code means that Xcopy did not find any files to copy.
2 This exit code means that the Xcopy was terminated by pressing CTRL+C.
4 This exit code means that an initialization error happened either because of insufficient memory or disk space or because you’ve entered invalid syntax.
5 This exit code means that there was a disk write error.

使用 Xcopy 进行脚本编写

除了交互式使用 Xcopy 外,如果您在脚本中使用它来自动执行任务,将更好地利用它的优势。以下是演示如何在脚本中使用 Xcopy 的几个示例。

Xcopy 批处理脚本复制带有错误处理的数据

此示例批处理脚本使用错误处理逻辑递归地复制所有文件。根据错误或退出代码,脚本返回显示错误原因的消息。

要创建批处理文件,请打开您选择的文本或代码编辑器,复制下面的代码,将其粘贴到编辑器中,并将文件保存为 copycomplete.bat

@echo off
rem This batch file copies all source
rem files in all directories and sub-directories from the source
rem path (%1) to the destination path (%2)

xcopy %1 %2 /s /e

if errorlevel 4 goto lowmemory
if errorlevel 2 goto abort
if errorlevel 0 goto exit

:lowmemory
echo Insufficient memory to copy files or
echo invalid drive or command-line syntax.
goto exit

:abort
echo You pressed CTRL+C keys due to which the copy operation has been aborted.
goto exit

:exit

接下来,要运行脚本,请在命令提示符或 PowerShell 中调用其名称,然后跟上源文件夹和目标文件夹。

pycomplete.bat xcopydemo xcopydemofolder
Running an Xcopy batch file

Xcopy 批处理脚本移动数据

Xcopy 没有内置功能来将文件和文件夹从源移动到目标。但是,作为一种变通方法,您可以创建一个脚本,该脚本首先会使用 Xcopy 复制文件,然后再从源删除文件。

下面的代码将文件复制到目标位置。如果复制过程成功,脚本将删除源处的文件。复制下面的代码并将其保存到一个名为 movefiles.bat 的新文件中。

Rem Batch file to move files

Xcopy /D /V %1 %2

Rem If the Xcopy process is successful (0), then delete the files at the source.
if errorlevel 0 (
echo Xcopy process completed successfully
del /Q %1
exit /B
)

Rem Errorlevel is not 0
echo The copy process has failed.

接下来,要执行 movefiles.bat 批处理文件,请在命令提示符或 PowerShell 中调用其名称,然后跟上源路径和目标路径,就像在前面的示例中所做的那样。

movefiles.bat xcopydemo xcopydemofolder

结论

如果您的工作涉及大量复制文件或创建文件备份,则 Xcopy 是一个极好的工具,可以帮助简化您的工作。Xcopy 提供准确和快速的文件复制结果,并提供许多选项来定制其行为,以满足您的需求。

Source:
https://adamtheautomator.com/xcopy/