修复(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 注册每日计划任务。 - 归档命名算法保持不变,已有归档不会失联。
55 lines
1.8 KiB
PowerShell
55 lines
1.8 KiB
PowerShell
<#
|
||
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'
|
||
)
|
||
}
|