拆出软件名录(67 行)、清单语法(114 行)、归档布局与迁移(47 行)、安全描述符(69 行),共 297 行;README 从 653 降到 360 行,每节原位留一句摘要加链接。 为什么拆:这四块是「要查的资料」,README 剩下的是「要读的流程」。混在一起时,想查清单语法的人得先滚过一百多行总览;拆开后每篇也能被单独引用与单独评审。 搬运按标题抽取原文、不重打,并在写之前断言正文长度、写之后再读回断言一次(第一次尝试就是栽在没有断言上:@(a, b, $arr) 不会展开数组,而是把 $arr 拼成一行,结果四篇各只有 5 行、正文却已从 README 删除。那次已回滚)。
3.0 KiB
归档布局、命名与迁移
本文从 README.md 拆出,单独成篇是为了让它能被单独引用与单独评审。
包内长什么样
| 条目类型 | 归档内部 |
|---|---|
| 软件名 + Slot 目录 | <Slot>\<该 Path 的内容> |
| 软件名 + Slot 文件 | 一个名为 <Slot> 的文件(没有扩展名,恢复时还原成 Path 里的原名) |
| 手写路径(目录) | <路径末级名>\...(与历史归档一致) |
| 手写路径(文件) | 一个名为 <路径末级名> 的文件 |
:+ / Include 追加项 |
你写的那个 <归档内相对路径>(目录就是目录,文件就是那个文件) |
7z 没有"入库时改名"的能力,所以打包前会建一个暂存目录:目录项用 junction、 文件项用硬链接(不可用时退回复制)按归档内的名字挂进去,打完立刻拆掉。 建不出连接点时会明确报错,不会悄悄换成另一种布局——布局一变恢复就对不上了。
归档名
| 条目类型 | 归档名 |
|---|---|
| 软件名 | <软件名>.7z |
| 字面路径 | <末级名>_from_<上级路径用 + 连接>.7z(: 归一化成 _) |
软件名 + @pathname |
同字面路径 |
::/@ Path=只改从哪儿读,不改归档名:软件名条目仍然叫<软件名>.7z。 想换归档名就用@pathname,或者干脆把条目写成绝对路径。
从旧版迁移(重要)
-
包内布局变了。 重构前生成的归档,包内顶层是源目录名;现在软件名条目多了一层 Slot。
Restore.ps1会识别这种情况(归档里没有该 Slot 时打印告警并按旧布局解), 所以旧归档仍然恢复得出来;但要让包内结构统一,跑一次.\Backup.ps1 -Force重打即可 (-Force会忽略"源未更新"判断)。 -
手写路径条目的归档名可能变了。 清单里把原来的软件名改成绝对路径之后, 归档名会从
<软件名>变成<末级名>_from_<...>。用重命名工具对齐(默认试运行、 逐份大小校验、重建 manifest,只改名不搬数据):.\tools\Rename-Archives.ps1 # 先看计划 .\tools\Rename-Archives.ps1 -Apply # 确认后执行它会先用当前规则算出目标名,再从"路径命名算法 / 名录里的软件名 / manifest 里记录过的归档名" 里找磁盘上真实存在的旧文件。
-
名录里的
Encrypt现在生效。 如果某个 Slot 写了Encrypt = $true(或清单里写了:encrypt),但运行时取不到口令,该条目会明确失败,绝不会退化成明文归档。 先准备好$env:BAKNRET_PASSWORD或用-KeyFile指定密码文件再跑。 -
孤儿归档审计会在每次备份后点名"磁盘上有、但清单里没有任何条目指向"的归档 (旧名字没迁移、条目被删掉或改名都会这样)。确认新归档校验通过之后再删旧文件。