如何为PowerShell备份脚本的Copy-Item操作添加进度条
PowerShell备份脚本进度功能修改方案
原生Move-Item、Copy-Item cmdlet没有内置细粒度进度显示,针对10GB量级的大体积备份场景,可通过枚举待操作文件、逐文件执行操作并同步调用Write-Progress的方式实现可视化进度展示,修改后完全保留原有脚本业务逻辑,完整代码如下:
$basedir = "Z:\Sales\Meyer Turku\NB-1400_1401 - ICON\MTO100 - NB-1400 - KT30 & KT31\04_Engineering\BG_Ceiling Matrix Backup\00. OLD backup" $today = (Get-Date).ToString('dd.MM.yyyy') $location = New-Item -Path $basedir -Type Directory -Name $today -Force # 阶段1:移动原有工程文件到日期命名的旧备份目录 $moveSourceRoot = "Z:\Sales\Meyer Turku\NB-1400_1401 - ICON\MTO100 - NB-1400 - KT30 & KT31\04_Engineering\BG_Ceiling Matrix" $moveDestRoot = $location.FullName $moveAllItems = Get-ChildItem -Path $moveSourceRoot -Recurse -Force $totalMoveCount = $moveAllItems.Count $processedMove = 0 Write-Progress -Activity "移动旧文件到备份目录" -Status "初始化中" -PercentComplete 0 foreach($item in $moveAllItems){ $processedMove++ $relativePath = $item.FullName.Substring($moveSourceRoot.Length).TrimStart('\') $targetItemPath = Join-Path $moveDestRoot $relativePath # 提前创建目录结构 if($item.PSIsContainer){ New-Item -Path $targetItemPath -ItemType Directory -Force | Out-Null }else{ Move-Item -Path $item.FullName -Destination $targetItemPath -Force } # 更新进度 $progressPercent = [math]::Round(($processedMove / $totalMoveCount)*100,2) Write-Progress -Activity "移动旧文件到备份目录" -Status "当前处理: $($item.FullName) | 已完成 $processedMove / $totalMoveCount 项" -PercentComplete $progressPercent } Write-Progress -Activity "移动旧文件到备份目录" -Completed # 阶段2:复制桌面Travel Pack内容到工程目录 $copySourceRoot = "C:\Users\bartosz.gornicki\Desktop\Travel Pack" $copyDestRoot = "Z:\Sales\Meyer Turku\NB-1400_1401 - ICON\MTO100 - NB-1400 - KT30 & KT31\04_Engineering\BG_Ceiling Matrix" $copyAllFiles = Get-ChildItem -Path $copySourceRoot -Recurse -File -Force $totalCopyCount = $copyAllFiles.Count $processedCopy = 0 Write-Progress -Activity "复制新文件到工程目录" -Status "初始化中" -PercentComplete 0 foreach($file in $copyAllFiles){ $processedCopy++ $relativePath = $file.FullName.Substring($copySourceRoot.Length).TrimStart('\') $targetFilePath = Join-Path $copyDestRoot $relativePath $targetFileDir = Split-Path $targetFilePath -Parent # 提前创建目标父目录 if(-not (Test-Path $targetFileDir)){ New-Item -Path $targetFileDir -ItemType Directory -Force | Out-Null } Copy-Item -Path $file.FullName -Destination $targetFilePath -Force # 更新进度 $progressPercent = [math]::Round(($processedCopy / $totalCopyCount)*100,2) Write-Progress -Activity "复制新文件到工程目录" -Status "当前处理: $($file.Name) | 已完成 $processedCopy / $totalCopyCount 个文件" -PercentComplete $progressPercent } Write-Progress -Activity "复制新文件到工程目录" -Completed Write-Host "✅ 备份同步操作全部完成"
脚本说明
- 完全保留原脚本的备份逻辑:先创建日期命名的旧备份目录、移动原有工程文件到旧备份、再将桌面Travel Pack内容递归复制到工程目录,
-Force参数规则和原脚本一致,会自动覆盖同名文件 - 进度条会实时展示三个核心信息:当前操作阶段、正在处理的文件路径、完成百分比+已处理/总项数,大文件拷贝时可以直观感知执行进度
- 逐文件操作前会自动创建缺失的目录结构,不会出现路径不存在的报错,最终文件结构和原脚本执行效果完全一致
内容的提问来源于stack exchange,提问作者Abram Balboni
相关产品推荐
相关产品推荐

