引入软件名录:清单写软件名,归档名也用软件名
新功能 - 新增 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 才能验,已实跑确认。
This commit is contained in:
1 parent
dbc0c00554
commit
045d51ac9c
9 files changed
+1330
-143
No files matched your search
@@ -0,0 +1,86 @@
|
||||
<#
|
||||
软件名录:维护"软件名 -> 目录"的映射。
|
||||
|
||||
有这个文件之后,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'
|
||||
}
|
||||
Reference in new issue
Block a user