Files
BakNRet/BackupConfig.psd1
T
Shuery dbc0c00554 重构为可核对、可恢复的备份工具(P0-P3)
修复(P0)
- 退出码:改用 .NET Process 继承控制台启动外部命令。Start-Process -PassThru 的
  ExitCode 在 PowerShell 7.7.0-preview.4 上恒为 $null,会把成功的压缩判成失败,
  并让 "exit 2 -> 删档重试" 的自愈分支永远不可达。
- BackupList.txt 解析:先按第一个 :: 切开再处理引号,修正整行被引号包住时
  排除表被吞进路径的问题(该条目此前被静默跳过,其 2.8 GB 归档成了孤儿)。
- 排除分隔符同时接受 , 与 ;:此前解析器只认 ; 而清单里写的是 ,,
  等于所有排除规则都没生效。
- 7z 排除参数不再嵌引号,含空格的模式自动转成 ?:旧写法 -x!"路径" 会让引号
  成为模式的一部分,导致排除对所有条目都失效。

加固(P1)
- 先写临时归档 -> 7z t 校验 -> 原子替换,中断不再污染正式归档。
- 放弃 7z 的更新模式 u:固实压缩下收益极小,却让排除规则改动与已删文件
  永远进不了归档。
- 新增 Backups/manifest.json 与 logs/*.log,跳过/失败有据可查。
- 结尾按失败数 exit;恢复支持 -WhatIf / -DryRun / -VerifyOnly / -Only。
- 恢复优先用 manifest 定位归档,并精确比较 BaseName(不再用 -Filter 通配)。
- 修正 tar 分支用 $LASTEXITCODE 判断成功与否的缺陷。
- 有警告(文件被占用)时拒绝用不完整的归档覆盖完整归档,需显式 -AcceptWarnings。

策略与安全(P2)
- Edge 条目加排除规则:解压后 4.22 GB 中 3.79 GB 是可再生的缓存/遥测/扩展本体,
  保留书签、密码、偏好、历史与站点数据。
- 可选 7z 加密(@encrypt 标记或全局开关),取不到口令时明确失败,绝不写明文。
- 磁盘空间守卫:放不下就跳过该条目,低于阈值告警。

工程化(P3)
- 新增 BackupConfig.psd1、README.md、.gitignore。
- tests/Run-Tests.ps1(32 项)与 tests/Run-E2E.ps1(16 项端到端验收)。
- tools/Register-BackupTask.ps1 注册每日计划任务。
- 归档命名算法保持不变,已有归档不会失联。
2026-09-21 20:10:18 +08:00

55 lines
1.8 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'
# 低于这个剩余空间(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
}
# 加密。默认关闭:一旦开启而口令丢失,备份就再也解不开。
# 口令来源:环境变量 BAKNRET_PASSWORD,或 PasswordFile 指向的文件首行(用 -KeyFile 覆盖)。
# 开启方式见 README「加密」一节。注意 7z 只接受命令行口令,
# 口令在本机进程列表里短暂可见,这是 7z 本身的限制。
Encryption = @{
Enabled = $false
PasswordFile = ''
EncryptHeaders = $true
}
# 所有条目都生效的排除模式,语法同 BackupList.txt(! 开头 = 任意层级匹配组件名)
DefaultExcludes = @(
'!Thumbs.db'
'!desktop.ini'
)
}