Files
BakNRet/docs/archive-layout.md
Shuery 60ecbc2933 docs: README 拆出四篇主题文档,本文件留总览与操作
拆出软件名录(67 行)、清单语法(114 行)、归档布局与迁移(47 行)、安全描述符(69 行),共 297 行;README 从 653 降到 360 行,每节原位留一句摘要加链接。

为什么拆:这四块是「要查的资料」,README 剩下的是「要读的流程」。混在一起时,想查清单语法的人得先滚过一百多行总览;拆开后每篇也能被单独引用与单独评审。

搬运按标题抽取原文、不重打,并在写之前断言正文长度、写之后再读回断言一次(第一次尝试就是栽在没有断言上:@(a, b, $arr) 不会展开数组,而是把 $arr 拼成一行,结果四篇各只有 5 行、正文却已从 README 删除。那次已回滚)。
2026-09-27 10:20:08 +08:00

3.0 KiB
Raw Permalink Blame History

归档布局、命名与迁移

本文从 README.md 拆出,单独成篇是为了让它能被单独引用与单独评审。

包内长什么样

条目类型 归档内部
软件名 + Slot 目录 <Slot>\<该 Path 的内容>
软件名 + Slot 文件 一个名为 <Slot> 的文件(没有扩展名,恢复时还原成 Path 里的原名)
手写路径(目录) <路径末级名>\...(与历史归档一致)
手写路径(文件) 一个名为 <路径末级名> 的文件
:+ / Include 追加项 你写的那个 <归档内相对路径>(目录就是目录,文件就是那个文件)

7z 没有"入库时改名"的能力,所以打包前会建一个暂存目录:目录项用 junction、 文件项用硬链接(不可用时退回复制)按归档内的名字挂进去,打完立刻拆掉。 建不出连接点时会明确报错,不会悄悄换成另一种布局——布局一变恢复就对不上了。

归档名

条目类型 归档名
软件名 <软件名>.7z
字面路径 <末级名>_from_<上级路径用 + 连接>.7z(: 归一化成 _)
软件名 + @pathname 同字面路径

:: / @ Path= 只改从哪儿读,不改归档名:软件名条目仍然叫 <软件名>.7z。 想换归档名就用 @pathname,或者干脆把条目写成绝对路径。

从旧版迁移(重要)

  1. 包内布局变了。 重构前生成的归档,包内顶层是源目录名;现在软件名条目多了一层 Slot。 Restore.ps1 会识别这种情况(归档里没有该 Slot 时打印告警并按旧布局解), 所以旧归档仍然恢复得出来;但要让包内结构统一,跑一次 .\Backup.ps1 -Force 重打即可 (-Force 会忽略"源未更新"判断)。

  2. 手写路径条目的归档名可能变了。 清单里把原来的软件名改成绝对路径之后, 归档名会从 <软件名> 变成 <末级名>_from_<...>。用重命名工具对齐(默认试运行、 逐份大小校验、重建 manifest,只改名不搬数据):

    .\tools\Rename-Archives.ps1            # 先看计划
    .\tools\Rename-Archives.ps1 -Apply     # 确认后执行
    

    它会先用当前规则算出目标名,再从"路径命名算法 / 名录里的软件名 / manifest 里记录过的归档名" 里找磁盘上真实存在的旧文件。

  3. 名录里的 Encrypt 现在生效。 如果某个 Slot 写了 Encrypt = $true(或清单里写了 :encrypt),但运行时取不到口令,该条目会明确失败,绝不会退化成明文归档。 先准备好 $env:BAKNRET_PASSWORD 或用 -KeyFile 指定密码文件再跑。

  4. 孤儿归档审计会在每次备份后点名"磁盘上有、但清单里没有任何条目指向"的归档 (旧名字没迁移、条目被删掉或改名都会这样)。确认新归档校验通过之后再删旧文件。