如何在不保留文件夹结构的前提下仅复制较新文件至根目录?
平级复制子文件夹文件并仅覆盖更新的目标文件
方法一:PowerShell 条件判断复制
直接遍历所有子文件,针对每个文件判断目标路径是否存在、源文件是否更新,仅在需要时复制:
Get-ChildItem "D:\VaM\Custom\Atom\Person\Morphs\temp2\female" -Recurse -File | ForEach-Object { $destFilePath = Join-Path "D:\VaM\Custom\Atom\Person\Morphs\female" $_.Name $destFileExists = Test-Path $destFilePath if (-not $destFileExists) { # 目标文件不存在,直接复制 $_ | Copy-Item -Destination $destFilePath } else { # 目标文件存在,对比最后修改时间 $destFile = Get-Item $destFilePath if ($_.LastWriteTime -gt $destFile.LastWriteTime) { # 源文件更新,强制覆盖 $_ | Copy-Item -Destination $destFilePath -Force } } }
逻辑说明
- 遍历源目录下所有子文件(不含文件夹)
- 对每个文件拼接目标根目录的完整路径
- 目标文件不存在时直接复制
- 目标文件存在时,仅当源文件的最后修改时间晚于目标文件时,才执行覆盖
方法二:Robocopy + 平级移动(适合大文件场景)
如果源文件数量多、体积大,Robocopy的效率更高,可以先将文件复制到临时目录(保留结构),再将临时目录下的所有文件平级移动到目标根目录:
# 步骤1:用Robocopy将更新的文件复制到临时目录(保留结构) $tempDir = "D:\VaM\Custom\Atom\Person\Morphs\temp_copy" robocopy "D:\VaM\Custom\Atom\Person\Morphs\temp2\female" $tempDir /E /XO # 步骤2:将临时目录下所有子文件平级移动到目标根目录 Get-ChildItem $tempDir -Recurse -File | ForEach-Object { $destFilePath = Join-Path "D:\VaM\Custom\Atom\Person\Morphs\female" $_.Name # 直接移动(若需保留源文件,改用Copy-Item) $_ | Move-Item -Destination $destFilePath -Force } # 步骤3:删除临时目录 Remove-Item $tempDir -Recurse -Force
逻辑说明
/E参数:复制所有子目录(包括空目录)/XO参数:仅复制比目标新的文件- 后续通过
Get-ChildItem遍历临时目录的所有文件,平级移动到目标根目录 - 最后清理临时目录
注意事项
- 如果源目录存在同名文件,最终保留的是最后处理的那个更新版本,需确认这种重名覆盖逻辑符合你的需求
- 若目标文件存在只读属性,需确保命令中的
-Force参数生效(两种方法均已包含)
内容的提问来源于stack exchange,提问作者Puck
相关产品推荐
相关产品推荐

