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

如何在PowerShell中用7-Zip实现增量备份?

用7-Zip实现PowerShell增量备份的方案

一、7-Zip实现增量备份的最佳方式

7-Zip原生支持增量备份,核心是借助-u参数结合更新规则,针对加密备份场景,推荐两种高效方案:

  1. 基于基准全量包的增量更新

    • 先创建一个全量备份作为基准档案(例如命名为full_backup_latest.zip)
    • 后续执行增量备份时,用-u参数指定基准包路径,7-Zip会自动对比源文件与基准包内的文件,仅将修改/新增的文件添加到新的增量包中
    • 注意:增量包必须与基准包使用相同密码,恢复时需同时解压基准包和所有增量包

    核心命令示例:

    $arguments = "a -tzip `"$destinationPath\incremental_backup_$(Get-Date -Format 'yyyyMMddHHmmss').zip`" `"$sourcePath\*`" -u`"$destinationPath\full_backup_latest.zip`" -p$password"
    
  2. 生成仅含变化文件的差异包

    • 添加-ms=off参数禁用固实压缩(固实压缩会将多个文件打包为一个块,导致增量备份无法单独更新单个文件,必须禁用)
    • 配合-up0q3r2x2y2z0w2自定义更新规则,仅备份新文件或修改过的文件,忽略已删除的文件
    • 这种方式生成的增量包体积更小,恢复时按顺序解压全量包+所有增量包即可

二、对比旧备份压缩包内文件哈希与新文件哈希的可行性

可以实现,但需要额外的遍历与对比操作,步骤如下:

  1. 导出旧备份内的文件哈希:用7-Zip的l -slt命令导出压缩包内所有文件的详细信息,其中包含CRC32/SHA-1哈希值(取决于压缩时的设置)
    $archiveHashData = & "C:\Program Files\7-Zip\7z.exe" l -slt -p$oldPassword "$oldBackupPath" | Select-String -Pattern "Path|CRC|SHA1"
    
  2. 计算源文件哈希:遍历源目录下的所有文件,用PowerShell的Get-FileHash命令计算对应哈希
  3. 哈希对比:将两者的哈希值逐一匹配,筛选出哈希不同的文件,再单独备份这些文件

不过这种方式比7-Zip原生的-u参数效率更低,适合对备份精度要求极高(比如担心时间戳判断不准确)的场景。

三、增量备份代码示例(适配你的全量备份逻辑)

if ($backupType -eq "i") { # i代表增量备份
    # 定义基准全量备份路径
    $fullBackupPath = Join-Path $destinationPath "full_backup_latest.zip"
    
    # 若未找到基准包,自动执行全量备份
    if (-not (Test-Path $fullBackupPath)) {
        Write-Host "未检测到基准全量备份,将自动执行全量备份..."
        robocopy $sourcePath $destinationPath /E
        
        $password = Read-Host -Prompt "请输入备份加密密码"
        $arguments = "a -tzip `"$fullBackupPath`" `"$sourcePath\*`" -p$password -ms=off"
        Start-Process -FilePath "C:\Program Files\7-Zip\7z.exe" -ArgumentList $arguments -Wait
    } else {
        $password = Read-Host -Prompt "请输入备份密码"
        # 生成带时间戳的增量备份包名
        $incrementalBackupName = "incremental_backup_$(Get-Date -Format 'yyyyMMddHHmmss').zip"
        $incrementalBackupPath = Join-Path $destinationPath $incrementalBackupName
        
        # 基于基准包创建增量备份
        $arguments = "a -tzip `"$incrementalBackupPath`" `"$sourcePath\*`" -u`"$fullBackupPath`" -p$password -ms=off -up0q3r2x2y2z0w2"
        Start-Process -FilePath "C:\Program Files\7-Zip\7z.exe" -ArgumentList $arguments -Wait
    }

    # 生成备份日志
    $logPath = Join-Path $destinationPath "backup_log_$(Get-Date -Format 'yyyyMMdd').txt"
    robocopy $sourcePath $destinationPath /L /NP /NJH /NJS /NDL /NS /NC /NFL /BYTES /XJ /R:0 /W:0 > $logPath
}

关键注意事项

  • 必须禁用固实压缩(-ms=off):否则增量备份无法单独更新单个文件,会导致备份效率极低
  • 保持密码一致性:增量备份的密码必须与基准全量备份的密码完全相同,否则恢复时会失败
  • 按时间戳命名增量包:方便后续恢复时按顺序处理所有备份包

内容的提问来源于stack exchange,提问作者LC195

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:30:40