PowerShell Copy-Item按文件日期复制WSUS更新时如何保留目录结构
问题核心原因
- 现有代码复制文件时,未计算源文件相对于WSUS内容根目录的相对路径,直接将文件指向导出目录根路径,导致所有文件平铺在根目录,丢失原有层级
- 逻辑顺序错误:在执行增量备份前就提前获取源目录文件列表,导致备份阶段同步的新增文件完全不会被纳入导出范围
- 日志启动时机偏晚,未覆盖目录清理、备份阶段的执行记录
- 未提前在导出路径下创建对应子目录,无法满足“空文件夹也要保留结构”的要求
修正后的实现逻辑
关键调整点
- 从脚本启动第一行开启全流程日志转录,覆盖清理、备份、导出、错误提示的所有记录
- 增量备份执行完成后再获取源目录的全量文件列表,确保新增文件全部被识别
- 遍历每个文件/文件夹时,先计算其相对于WSUS源根目录的相对路径,拼接导出目录的对应目标路径
- 遍历过程中优先同步创建所有对应子目录,无论目录是否为空
- 对满足修改时间过滤条件的文件,直接复制到对应的目标子路径下,避免平铺
可直接运行的修正代码
##Set directory locations and variables $nicedate = Get-Date -UFormat %m-%d-%Y $source = "C:\temp\WsusContent\" $bckp = "C:\temp2\WsusContent" $dest = "C:\temp2\export" $date = (Get-Date).AddDays(-28) $log = "C:\temp\wsus_log_$nicedate.txt" # 开启全流程日志转录,覆盖之前的旧日志 Start-Transcript -Path $log -Append:$false ##Delete all subfolders and Files from destination Get-ChildItem $dest | Remove-Item -Force -Recurse Write-Output "CLEANUP: 导出目录清理完成" # 增量同步WSUS内容到备份目录 try{ xcopy /E/H/D/C/I/Y $source $bckp Write-Output "BACKUP: WSUS增量备份完成" } catch{ Write-Output "ERROR: 备份失败: $($_.Exception.Message)" } # 备份完成后再获取源目录全量列表,确保新增文件被纳入 $items = Get-ChildItem -Recurse $source ## 按原目录结构同步内容到导出目录 foreach($item in $items){ # 计算当前项相对于源根目录的相对路径 $relativePath = $item.FullName.Substring($source.TrimEnd('\').Length).TrimStart('\') $targetPath = Join-Path -Path $dest -ChildPath $relativePath if($item.PSIsContainer){ # 同步创建所有对应文件夹,空文件夹也会保留 New-Item -Path $targetPath -ItemType Directory -Force | Out-Null continue } # 按修改时间过滤文件 if($item.LastWriteTime -gt $date){ # 提前创建文件所在的子目录 $targetDir = Split-Path -Path $targetPath -Parent if(-not (Test-Path $targetDir)){ New-Item -Path $targetDir -ItemType Directory -Force | Out-Null } Copy-Item $item.FullName -Destination $targetPath -Force Write-Output "COPY: 已导出文件 $relativePath" } } # 流程收尾 Write-Output "EXPORT: 增量导出流程执行完成" Stop-Transcript
运行效果
- 所有符合时间条件的文件完整保留原有WSUS目录层级,不会平铺在导出目录根下
- 源目录下的空文件夹会在导出目录下同步创建,满足光盘刻录的结构要求
- 全流程执行记录、错误信息、单个文件导出明细会自动写入指定日志文件,无遗漏
内容的提问来源于stack exchange,提问作者Justin Lawhorne
相关产品推荐
相关产品推荐

