请求修改PowerShell日志迁移脚本:解决重复创建子目录问题
修复PowerShell日志同步脚本的重复目录创建问题
原脚本的核心问题在于每次运行都会递归复制源目录下的所有子项,即使目标目录已存在,Copy-Item -Recurse -Force的逻辑会强制重复处理目录结构;再加分机子目录因每日新增日志导致最后修改时间更新,进一步加剧了不必要的重复操作。
以下是优化后的脚本,改用Robocopy实现增量镜像同步,同时保留原有的旧文件清理逻辑:
# 设置源目录和目标目录路径 $sourcePath = "D:\3cx" $destinationPath = "D:\3cxnew" # 确保目标目录存在 if (-not (Test-Path -Path $destinationPath)) { New-Item -ItemType Directory -Path $destinationPath | Out-Null } # 使用Robocopy进行增量同步:只复制新增/修改的文件,镜像目录结构,跳过已存在且无变化的项 Robocopy $sourcePath $destinationPath /E /XO /NFL /NDL /NJH /NJS # 参数说明: # /E: 复制所有子目录,包括空目录 # /XO: 跳过比目标文件旧的文件(只同步新增或更新的内容) # /NFL /NDL: 不显示文件/目录列表 # /NJH /NJS: 不显示作业头/摘要信息 Write-Host "文件和目录已从 $sourcePath 同步至 $destinationPath" # 设置旧文件保留期限(180天前) $limit = (Get-Date).AddDays(-180) # 删除源目录中超过保留期限的文件 Get-ChildItem -Path $sourcePath -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt $limit } | Remove-Item -Force # 清理源目录中遗留的空目录(包括嵌套空目录) Get-ChildItem -Path $sourcePath -Recurse -Force -Directory | Sort-Object FullName -Descending | Where-Object { (Get-ChildItem -Path $_.FullName -Force | Measure-Object).Count -eq 0 } | Remove-Item -Force
关键优化点
- 替换复制逻辑:用
Robocopy替代Copy-Item,Robocopy是Windows原生的文件同步工具,支持增量同步,只会处理新增或修改的文件/目录,彻底避免重复创建已存在的目录结构。 - 优化空目录清理:先按目录路径倒序排序,确保先删除深层空目录,再处理上层目录,避免因子目录未删除导致上层目录无法被识别为空的问题。
- 减少冗余操作:通过
Robocopy的参数控制输出,让脚本运行更简洁高效。
内容的提问来源于stack exchange,提问作者Arif Muradli
相关产品推荐
相关产品推荐

