如何复制文件或文件夹而不覆盖现有文件?


要在远程路径上复制文件/文件夹而不覆盖现有文件/文件夹,您可以使用多个 cmdlet,例如 Copy-Item、Robocoy 和 Xcopy 等。由于 Copy-Item 是一个标准的 cmdlet,我们将检查其支持的参数是否可以防止覆盖。

如果 Copy-Item 不起作用,我们将检查其替代命令。Copy-Item 只是简单地覆盖目标路径上的文件和文件夹,并复制较新的文件。

例如,要将文件从源文件夹 C:\Test1 复制到目标文件夹 C:\Test2,使用以下命令,它会简单地覆盖文件而不提示。

示例

Copy-Item C:\Test1\* C:\Test2 -Recurse -Verbose

输出

PS C:\Temp> Copy-Item C:\Test1\* C:\Test2 -Recurse -Verbose
VERBOSE: Performing the operation "Copy File" on target "Item: C:\Test1\File1.txt
Destination: C:\Test2\File1.txt".
VERBOSE: Performing the operation "Copy File" on target "Item: C:\Test1\File2.txt
Destination: C:\Test2\File2.txt".

我们还有另一个 -Confirm 参数,但它只是向用户确认是否需要将文件复制到目标文件夹。如果我们为 -Confirm 参数选择 $True,则它会询问每个文件是否需要复制,但如果系统上有数百个文件,则此方法将不起作用。

Copy-Item C:\Test1\* -Destination C:\Test2\ -Confirm:$true -Verbose
PS C:\Temp> Copy-Item C:\Test1\* -Destination C:\Test2\ -Confirm:$true -Verbose

Confirm
Are you sure you want to perform this action?
Performing the operation "Copy File" on target "Item: C:\Test1\File1.txt Destination:
C:\Test2\File1.txt".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):

使用 -Force 参数用于覆盖只读文件内容。因此,这也没有帮助,所以我们可以使用另一种方法,例如通过 Get-ChildItem 过滤现有文件并跳过它们,但这需要编写一些代码和循环,而我们有一个 robocopy 命令,它支持防止覆盖文件/文件夹。

Robocopy C:\Test1\ C:\Test2\ /E /XC /XN /XO

输出

PS C:\> Robocopy C:\Test1\ C:\Test2\ /E /XC /XN /XO
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Saturday, August 29, 2020 2:15:33 PM
Source : C:\Test1\
Dest : C:\Test2\
Files : *.*
Options : *.* /S /E /DCOPY:DA /COPY:DAT /XO /XN /XC /R:1000000 /W:30
------------------------------------------------------------------------------
      2 C:\Test1\
   *EXTRA File    8 File3.txt
100% New File    11 File2.txt
------------------------------------------------------------------------------
         Total    Copied Skipped Mismatch FAILED Extras
Dirs :    1          0      1       0         0       0
Files :   2          1      1       0         0       1
Bytes :  22         11     11       0         0       8
Times : 0:00:00    0:00:00                0:00:00   0:00:00
Speed :    1833 Bytes/sec.
Speed :    0.104 MegaBytes/min.
Ended : Saturday, August 29, 2020 2:15:33 PM

下面解释了开关。

/E − 复制子项(如 Copy-Command 中的 -recursive)

/XC − 防止覆盖具有相同时间戳的文件。

/XN − 防止覆盖时间戳比源文件更新的文件。

/XO − 防止覆盖时间戳比源文件旧的文件。

更新于: 2020年9月3日

6K+ 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告