如何在PowerShell中复制文件并保留文件夹结构?

4

我总是无法做到这一点。

我有一个现有的文件夹c:\MyApps\Websites\MySite,其中已经运行了一个现有的网站。 我已经下载了最新的位于c:\temp\MySite\artifacts下的内容。

当我尝试运行它时

$source "c:\temp\MySite"
$destination "c:\MyApps\Websites\MySite"
copy-item $source $destination -recurse -force

如果 c:\MyApps\Websites\MySite 已经存在,则会尝试将其放入 c:\MyApps\Websites\MySite\artifacts,但如果不存在,则会正确地复制它。对此不太确定发生了什么。有什么建议吗?
1个回答

9

只需使用 robocopy 命令,它是专门为此类事情设计的。

robocopy $source $destination /E

它附带在 Windows 7 中,因此它是内部命令,因此仍然是“Powershell”方式(我的看法),但如果您想使用复制命令,则非常接近,但您当前的实现会获取 source 文件夹并将其放入 target 中(即结果将是 C:\target\source\files,而不是 C:\target\files)。当您想让 target 的内部看起来像 source 的内部时,需要执行以下操作:

cp C:\source\* C:\target -r -fo

注意 *,这将获取 source 文件夹的 内容。如果您希望首先清除 target,请在复制之前执行 rm -r -fo C:\target\*

Powershell 无法处理长路径,因此如果您有长文件名或深层文件夹,则仍需要使用 robocopy。


这不会同步文件夹,对吧?换句话说,如果目标目录中存在但源目录中不存在的文件,它会将它们删除吗? - Micah
1
@Micah 要删除目标中不在源中的内容,必须发出/PURGE标志。 此外,/MIR等同于/E /PURGE。 您可以通过发出robocopy /?来查看更多信息。 - SpellingD
天啊,Robocopy!你这货到底躲在哪里了。我会点赞这个答案,因为它很棒,但我还是想知道如何用PowerShell的方式来做。 - Micah

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