PowerShell/Robocopy脚本优化:仅复制含PDF的文件夹及内容(保结构)
解决PowerShell脚本无法清理PDF文件夹父文件的问题
你的脚本当前仅对包含PDF的子目录执行镜像复制,但未处理目标目录中父文件夹或非PDF目录下的残留文件,导致这些文件无法被清空。核心原因是robocopy /MIR仅作用于单个目录的镜像,不会处理目录树外的文件。
解决方案
我们需要分两步实现:先复制所有含PDF的目录及其内容,再清理目标目录中不属于这些目录树的所有文件。
完整脚本
# 定义源目录和目标目录 $source = "H:\MC4" $destination = "H:\Mirror" # 筛选所有包含PDF文件的子目录(包括子目录下的PDF) $dirsWithPDFs = Get-ChildItem -Path $source -Recurse -Directory | Where-Object { # 检查当前目录或其子目录是否存在PDF文件 [bool](Get-ChildItem -Path $_.FullName -Filter *.pdf -File -Recurse) } # 复制所有含PDF的目录及其内容到目标目录,保持完整结构 foreach ($dir in $dirsWithPDFs) { $destDir = $dir.FullName.Replace($source, $destination) # /E: 复制所有子目录(包括空目录);/COPYALL: 复制所有文件属性;/R/W: 重试和等待参数 robocopy $dir.FullName $destDir /E /COPYALL /R:3 /W:1 } # 获取目标目录中对应含PDF目录的完整路径集合 $targetDirTree = $dirsWithPDFs | ForEach-Object { $_.FullName.Replace($source, $destination) } # 清理目标目录中所有不属于PDF目录树的文件 Get-ChildItem -Path $destination -Recurse -File | ForEach-Object { $fileParentDir = $_.Directory.FullName # 检查文件所在目录是否属于目标目录树的一部分 $isValidPath = $targetDirTree | Where-Object { $fileParentDir.StartsWith($_) } if (-not $isValidPath) { Remove-Item $_.FullName -Force -ErrorAction SilentlyContinue Write-Host "已清理无关文件: $($_.FullName)" } }
关键说明
- 优化了含PDF目录的筛选逻辑,用
[bool]直接判断是否存在PDF文件,更简洁高效。 - 复制时改用
/E /COPYALL替代/MIR,避免单个目录镜像的局限性,同时完整保留文件属性。 - 新增清理步骤:遍历目标所有文件,检查其所在目录是否属于我们需要保留的PDF目录树,不属于则删除,确保父文件夹及无关目录的文件被清空。
内容的提问来源于stack exchange,提问作者Jozef_van_Thom
相关产品推荐
相关产品推荐

