使用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 Volume Shadow Copy Service (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信息外,您還可以包括文件的審計設置。如果您的組織應用組策略對象(GPO)來審計文件,複製審計設置可能很有用。

使用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

帶驗證複製文件

像其他任務一樣,複製文件可能並不總是返回100%的成功結果。即使沒有可見的錯誤,在傳輸過程中一些文件可能會損壞。

使用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 複製源文件夾結構而不包括內容。

為此,執行 Xcopy 命令並使用/T 開關。使用 /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 會返回操作的退出代碼,您可以使用它來判斷操作是否成功。退出代碼非常有用,特別是如果您的任務或腳本根據收到的退出代碼執行操作。

命令殼層將退出代碼保存在 %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沒有內建功能來移動來源到目的地的文件和文件夾。但是,作為一個解決方法,您可以創建一個腳本,該腳本首先會複製文件,然後從來源刪除文件。

下面的代碼將文件複製到目的地。如果複製過程成功,腳本將刪除來源的文件。複製下面的代碼並將其保存在名為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/