Files
BakNRet/BackupConfig.psd1
T
Shuery e114cae8c8 P0-P3 全量重构:退出码 / 解析修复、manifest 与 7z t 校验、干跑、排除规则、日志、测试与计划任务
P0 正确性
- 退出码:改用 .NET Process 直接启动、让子进程继承控制台,不再用 Start-Process -PassThru
  (在 7.7.0-preview.4 上 ExitCode 恒为 $null,会把成功的压缩判成失败);
  7z / RAR / tar 三条解压分支统一走同一个取退出码的封装。
- BackupList 解析:先按第一个 :: 切段再处理引号(整行被一对引号包住的写法不再把排除表
  吞进路径);排除表同时接受 , 与 ;(旧实现只认 ;,导致排除从未生效);支持 :- / :+ / @flag。
- 补回 .ssh 与孤儿归档:.ssh 进清单;孤儿归档在备份端也做审计并点名;
  带 -Only / -Skip 时不再把未选中的归档误报成孤儿。
- Resolve-BackupEntry 里 $rootName 在赋值前被引用(会读到外层作用域残留值),已提前赋值。

P1 归档可靠性
- 每个条目写进 manifest.json:源、归档、时间、退出码、校验结果、失败原因,
  并区分 warnings(在位归档)与 attemptWarnings(本次尝试)。
- 归档后做 7z t 内容校验,先写 .tmp、校验通过再原子替换(File.Move overwrite)。
- manifest.roots 记录归档内**真实**的顶层条目名(原先记的是软件名,Edge 实际是 "User Data")。

P2 可用性
- Restore 支持 -WhatIf / -DryRun / -VerifyOnly / -Only / -Skip;
  这三种"只看不写"的模式一个字节都不写(原先会写回 manifest.json)。
- Edge 等高缓存条目加排除规则并实测:1781 MB / 27961 项 -> 72 MB / 2294 项;
  书签、密码、Cookies、偏好、历史、IndexedDB、Local Storage 全部保留。
  普通模式是相对归档根目录锚定的,嵌套的那些(如 OneAuth\WebView2 里的 Crashpad)
  改用 ! 组件形式才会命中。
- 日志落盘 logs/<backup|restore>-<时间戳>.log;退出码按失败数返回。
- tools/Register-BackupTask.ps1 注册每日计划任务;tools/Rename-Archives.ps1 迁移旧归档名。
- root= 标记此前静默失效,现在明确告警(该功能尚未实现)。

P3 测试与验证
- tests/BakNRet.Tests.ps1:Pester 5 套件 62 项(含用子进程跑 Backup.ps1 / Restore.ps1
  的端到端与针对上述缺陷的回归)。
- tests/Run-Pester.ps1 + tools/Install-TestDependencies.ps1:把 Pester 装到仓库内 .tools/,
  不动机器上的全局模块(系统自带的 3.4.0 缺 Should -Be)。
- tests/Restore-Drill.ps1:真实归档恢复演练,明确区分"源在备份后变过"与"归档/解压有问题"。
- tests/Run-Tests.ps1(49 项,零依赖)与 tests/Run-E2E.ps1(23 项)继续可用;三套共 134 项全通过。

真实机器验证
- 生产归档 22/22 通过 7z t;-VerifyOnly 不再改动 manifest.json(SHA256 前后一致)。
- 真实恢复演练 12/12 通过,27,670 个文件与活源逐字节一致。
- 修复了生产 scoop-persist.7z:原先只有 90 字节(空归档)而源有 1.3 GB,
  重打包后 233 MB,恢复演练 26981/26981 全部一致。
2026-09-21 23:02:47 +08:00

73 lines
2.7 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<#
BakNRet 配置文件。
优先级:命令行参数 > 本文件 > 代码内置默认值。
本文件缺失或某键缺失都直接用默认值,不会报错。
#>
@{
# 归档存放目录(相对路径按脚本所在目录解析)
BackupDir = 'Backups'
# 每次运行的日志目录(backup-<时间戳>.log / restore-<时间戳>.log)
LogDir = 'logs'
# 使用 -Snapshot 时留存带时间戳的副本
SnapshotDir = 'Backups\snapshots'
# 软件名录("软件名 -> 目录"映射表)。相对路径按本配置所在目录解析。
# BackupList.txt 里写软件名时靠它换成真实目录,归档名也取软件名。
SoftwareCatalog = 'SoftwareCatalog.psd1'
# 名录里写的目录不存在时,按 "<名>_*" / "<名>-*" 向下找几层做前缀补全
# (应对 legendary -> legendary_2.0.4 这类带后缀的目录)
CatalogMaxDepth = 5
# 低于这个剩余空间(GB)就告警;真正放不下某个条目时会直接跳过该条目
MinFreeSpaceGB = 5
# 归档写完后用 `7z t` 校验内容 CRC,失败则丢弃临时文件
VerifyArchive = $true
# 是否默认给所有归档计算 SHA256(大归档会明显变慢)
ComputeHash = $false
# 7z 压缩级别 0-9
CompressionLevel = 9
# 压缩工具的实时输出:live = 直接显示(默认);quiet = 抑制,只留日志与 manifest
ToolOutput = 'live'
# 是否默认给所有条目留存快照
Snapshot = @{
Enabled = $false
KeepCount = 3
KeepDays = 30
}
# 加密。默认关闭:一旦开启而口令丢失,备份就再也解不开。
#
# **本仓库不存放任何口令**,这里只记"去哪儿找":
# Encryption.Enabled = $true -> 所有条目都加密
# 或 BackupList.txt 里给单个条目加 @encrypt(如 .ssh @encrypt)
#
# 口令本身按以下优先级获取(见 README「加密」):
# 1. -Password 命令行参数
# 2. $env:BAKNRET_PASSWORD
# 3. PasswordFile 指向的文件首行(文件必须在仓库之外)
# 4. 交互式询问(仅交互式会话;计划任务里不会停下来等输入)
# 全都拿不到时该条目明确失败,绝不退化成明文归档。
#
# 注意 7z 只接受命令行口令,口令在本机进程列表里短暂可见,这是 7z 本身的限制。
Encryption = @{
Enabled = $false
PasswordFile = ''
EncryptHeaders = $true
}
# 所有条目都生效的排除模式,语法同 BackupList.txt(! 开头 = 任意层级匹配组件名)
DefaultExcludes = @(
'!Thumbs.db'
'!desktop.ini'
)
}