PowerShell比较两文件夹并复制差异文件,需保留目录结构
解决保留目录结构的文件夹差异复制问题
你的核心问题是没有保留文件相对于原文件夹的层级结构,直接把差异文件都堆到了目标文件夹的根目录里。要搞定这个,我们需要先算出每个差异文件在原文件夹中的相对路径,然后在目标文件夹里重建这个层级,再完成复制操作。
下面是修改后的PowerShell代码,我会把关键逻辑拆解给你看:
# 先把所有路径单独定义,后续改起来更方便 $oldFolder = "C:\Users\akalkandelen\Desktop\old" $newFolder = "C:\Users\akalkandelen\Desktop\new" $targetFolder = "C:\Users\akalkandelen\Desktop\release" # 获取两个文件夹下的所有文件(只取文件,排除文件夹本身) $oldFiles = Get-ChildItem -Recurse -File -Path $oldFolder $newFiles = Get-ChildItem -Recurse -File -Path $newFolder # 对比两个文件夹,拿到仅存在于某一边的差异文件 $diffFiles = Compare-Object -ReferenceObject $oldFiles -DifferenceObject $newFiles -Property FullName -PassThru foreach ($file in $diffFiles) { # 计算当前文件相对于原文件夹的相对路径 if ($file.FullName.StartsWith($oldFolder)) { $relativePath = $file.FullName.Substring($oldFolder.Length + 1) } else { $relativePath = $file.FullName.Substring($newFolder.Length + 1) } # 拼接出目标文件夹中的完整路径 $targetFilePath = Join-Path -Path $targetFolder -ChildPath $relativePath # 先创建目标文件的父目录(如果不存在的话) $targetDir = Split-Path -Path $targetFilePath -Parent if (-not (Test-Path -Path $targetDir)) { New-Item -ItemType Directory -Path $targetDir | Out-Null } # 复制文件到目标路径,-Force可以覆盖同名文件(按需取舍) Copy-Item -Path $file.FullName -Destination $targetFilePath -Force }
关键细节说明:
- 单独定义路径变量:把文件夹路径抽出来单独写,后续修改路径时不用到处找,也减少拼写错误。
- 只处理文件:加上
-File参数,避免把空文件夹也纳入对比(如果需要处理空文件夹差异,可以去掉这个参数,再调整逻辑)。 - 保留层级的核心:相对路径:通过判断文件来自旧文件夹还是新文件夹,截取掉根目录的部分,得到文件的相对层级结构。
- 先建目录再复制:用
Split-Path拿到文件的父目录,先创建这个目录,避免复制时因为目录不存在报错。 - 强制覆盖(可选):
-Force参数会覆盖目标路径中已有的同名文件,如果你不想覆盖,可以去掉这个参数。
这样修改后,差异文件就会完全按照原有的子文件夹结构,复制到release文件夹里了。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

