PowerShell递归复制各文件夹最新文件遇问题,求排查脚本错误
问题分析与修正
原脚本的核心错误
- 路径硬编码导致范围错误:内层
Get-ChildItem硬写了固定路径,会遍历整个G:\xyz\Test\A下的所有文件,而非当前循环的子文件夹内的文件,导致每次循环都取全局最新文件,而非单个文件夹的最新文件。 - 未保留目录结构:直接将文件复制到
G:\xyz\Test\B\根目录,没有在B下创建与A对应的子文件夹,丢失层级结构。 - 遍历逻辑冲突:外层只遍历一级子目录,但内层用了
-Recurse,两者逻辑混乱,要么遍历所有层级文件夹,要么仅处理一级,原脚本无法覆盖所有子文件夹。
修正后的脚本
要实现每个文件夹(含所有子文件夹)保留结构,仅复制各文件夹内最新文件,可以使用以下脚本:
# 遍历A下所有层级的文件夹 Get-ChildItem -Path 'G:\xyz\Test\A' -Directory -Recurse | ForEach-Object { # 获取当前文件夹内的最新文件 $latestFile = Get-ChildItem -Path $_.FullName -File | Sort-Object LastWriteTime -Descending | Select-Object -First 1 if ($latestFile) { # 构建与原路径对应的目标文件夹路径 $targetDir = $_.FullName.Replace('G:\xyz\Test\A', 'G:\xyz\Test\B') # 确保目标文件夹存在,不存在则创建 New-Item -Path $targetDir -ItemType Directory -Force | Out-Null # 复制最新文件到目标文件夹 Copy-Item -Path $latestFile.FullName -Destination $targetDir } } # 可选:处理A根目录下的最新文件(如果需要保留根目录的最新文件) $rootLatestFile = Get-ChildItem -Path 'G:\xyz\Test\A' -File | Sort-Object LastWriteTime -Descending | Select-Object -First 1 if ($rootLatestFile) { Copy-Item -Path $rootLatestFile.FullName -Destination 'G:\xyz\Test\B\' }
关键说明
- 用
Get-ChildItem -Directory -Recurse遍历A下所有层级的文件夹,确保不遗漏任何子目录。 - 通过
$_.FullName关联当前循环的文件夹,保证每次仅处理该文件夹内的文件。 - 用路径替换的方式构建目标目录,保留原有的层级结构,并用
New-Item -Force确保目标文件夹存在。 - 根目录的处理逻辑可根据需求选择是否保留。
内容的提问来源于stack exchange,提问作者cdfj
相关产品推荐
相关产品推荐

