Files
BakNRet/SoftwareCatalog.psd1
T
Shuery 045d51ac9c 引入软件名录:清单写软件名,归档名也用软件名
新功能
- 新增 SoftwareCatalog.psd1 —— "软件名 -> 目录"映射表,BackupList.txt 里
  直接写软件名即可,归档名也就是软件名(FooClolor.7z),
  不再是 FooClolor_from_C_+Programs.7z 这种由路径拼出来的名字。
- 三种写法可混用:软件名、字面路径(现有清单无需改写)、软件名 @pathname。
- 名录支持前缀补全(legendary -> legendary_2.0.4,只认 <名>_* / <名>-*)、
  Variants(同名目录在多处)、Includes(分文件维护)。
- tools/Rename-Archives.ps1:存量归档重命名,默认试运行,逐份大小校验并重建 manifest。
- 归档名重复直接报错,不再静默互相覆盖。

两套测试全绿:单元 42 项、端到端 23 项(新增名录命名/解析/迁移用例)。

过程中修掉的缺陷
- Resolve-BackupEntry 里 @pathname 与 Unresolved 分支顺序错误,
  @pathname 会被静默吃掉(改名后仍用软件名)。
- 源目录被删除时解析器丢掉 Sources,导致恢复端把软件名当路径、
  报 "Cannot bind argument to parameter 'Path' because it is an empty string"。
  恢复的语义恰恰是"源不存在就要还原回去",现在 Sources 照旧给出。
- 源存在性检查曾被漏掉,Get-Item 对不存在路径抛异常会中断整轮备份;
  且不能用 Join-Path 探测——目标盘符不存在时它会直接抛异常。
- 计划任务脚本外的 Caller 需要 -DryRun 才能验,已实跑确认。
2026-09-21 20:55:19 +08:00

87 lines
3.5 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.
<#
软件名录:维护"软件名 -> 目录"的映射。
有这个文件之后,BackupList.txt 里可以直接写软件名:
FooClolor
Kazumi :: !*Cache
Edge :: !*Cache,component_crx_cache
.ssh @encrypt
归档包的名字也就是软件名(`FooClolor.7z`),不再是
`FooClolor_from_C_+Programs.7z` 这种由路径拼出来的名字。
写法:
<软件名> = '<目录>'
软件名的限制:
* 必须是合法的文件名(不能含 \ / : * ? " < > |),因为它就是归档名;
* 不能含 `\` 或 `/` 或 `%`,否则会被当作字面路径而不是软件名;
* **含 `-` 或 `.` 的名字必须写成带引号的键**,否则 PowerShell 会把
`a-b` 解析成减法表达式并报 "Missing '=' operator":
'scoop-config' = '...' # 正确
scoop-config = '...' # 报错
* 建议用英文/数字,但中文也可以。
目录可以写环境变量,例如 '%UserProfile%\.ssh'。
两个便利特性:
1. 目录不存在时会按前缀补全:写 'D:\Programs\legendary',实际目录是
'D:\Programs\legendary_2.0.4',会自动匹配(只认 `<名>_*` 与 `<名>-*`,
不会把 Legendary 误配成 LegendarySomething)。
2. 同名目录出现在多个位置时,用字典形式显式列出,所有位置都会打进同一个归档:
ImHex = @{
Path = 'D:\Hex\ImHex'
Variants = @('D:\Hex\ImHex', 'E:\Backup\ImHex')
}
分文件维护:用 Includes 引入其它名录文件(路径相对本文件):
@{
Includes = @('SoftwareCatalog.games.psd1')
...
}
#>
@{
# ---- 用户配置 / 开发环境 ----
# 含 `-` 或 `.` 的键必须加引号,否则会被当成减法表达式(见文件开头说明)
legendary = '%UserProfile%\.config\legendary'
opencode = '%UserProfile%\.config\opencode'
'scoop-config' = '%UserProfile%\.config\scoop'
'scoop-persist' = '%UserProfile%\scoop\persist'
'.ssh' = '%UserProfile%\.ssh'
CodeSpace = 'D:\UserData\Documents\CodeSpace'
PowerShell = '%UserProfile%\Documents\PowerShell'
WindowsPowerShell = '%UserProfile%\Documents\WindowsPowerShell'
# ---- 应用数据 ----
AutoDarkMode = '%AppData%\AutoDarkMode'
Kazumi = '%AppData%\com.example\Kazumi'
piliplus = '%AppData%\com.example\piliplus'
fnm = '%AppData%\fnm'
'twinkle-tray' = '%AppData%\twinkle-tray'
# ---- 浏览器与终端 ----
Edge = '%LocalAppData%\Microsoft\Edge\User Data'
WindowsTerminal = '%LocalAppData%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json'
# ---- 系统 ----
Startup = '%ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup'
# ---- C:\Programs ----
BaiduNetdisk = 'C:\Programs\BaiduNetdisk'
FooClolor = 'C:\Programs\FooClolor'
March7thAssistant = 'C:\Programs\March7thAssistant'
MiFlash = 'C:\Programs\MiFlash'
MiFlash_Unlock = 'C:\Programs\MiFlash_Unlock'
QuarkCloudDrive = 'C:\Programs\QuarkCloudDrive'
translucenttb = 'C:\Programs\ScoopApps\apps\translucenttb\current\settings.json'
'ScoopApps-persist' = 'C:\Programs\ScoopApps\persist'
# ---- 其它盘 ----
Aria = 'D:\UserData\Documents\Aria'
}