You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:24:25