Files
BakNRet/BackupConfig.psd1
T
Shuery 232a82cd3c style: 逐条修静态分析告警(706 → 44),并把 MaxDepth 这条假承诺删掉
修掉的:空 catch 5 处;名词白名单 7 处;default-value 开关、自带 -WhatIf、lab 的明文口令与 irm|iex 各挂抑制并写明理由。

MaxDepth:它是分析器拓出来的真 bug —— 参数声明了却从未使用,也就是配置里的 CatalogMaxDepth 是假的,前缀补全实际只查 1 层,而配置注释与 README 都承诺「向下找几层」。按确认过的原则处理:**先让文档不撒谎**,所以把整条链路去掉(配置默认值、三个函数的参数、70 处实参、配置注释),而不是留一个假旋钮。零行为变化。想真的支持多层补全时,那是一个独立决定。

剩下 3 条都是分析器的误判,而且我实测确认过其中一条:$sourcePath 被报「赋值后从未使用」,我照着改成 $null = 之后,Set-StrictMode -Version 3.0 下读未定义变量直接抛错,Security 套件的 BeforeAll 挂掉、4 条用例连带失败。恢复后才绿。

这一类误判有共同成因:静态分析看不到「在传给 Test-Case / It / Where-Object 的 scriptblock 里被使用」。所以我只对能证明是误判的挂抑制并写明理由,不为了数字好看去改代码。

验收:test.ps1 9/9 全绿(7 与 5.1)、100 个文件两版解析零错、Run-RealSmoke 4/4。
2026-09-27 10:16:10 +08:00

96 lines
4.4 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.
<#
BakNRet 配置文件。
优先级:命令行参数 > 本文件 > 代码内置默认值。
本文件缺失或某键缺失都直接用默认值,不会报错。
#>
@{
# 归档存放目录(相对路径按脚本所在目录解析)
BackupDir = 'Backups'
# 每次运行的日志目录(backup-<时间戳>.log / restore-<时间戳>.log)
LogDir = 'logs'
# 使用 -Snapshot 时留存带时间戳的副本
SnapshotDir = 'Backups\snapshots'
# 软件名录("软件名 -> 目录"映射表)。相对路径按本配置所在目录解析。
# BackupList.txt 里写软件名时靠它换成真实目录,归档名也取软件名。
SoftwareCatalog = 'SoftwareCatalog.psd1'
# 低于这个剩余空间(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
}
# 加密。默认关闭:一旦开启而口令丢失,备份就再也解不开。
#
# **本仓库不存放任何口令**,这里只记"去哪儿找":
# Encryption.Enabled = $true -> 所有条目都加密
# SoftwareCatalog.psd1 的 Slot 写 Encrypt = $true(如 OpenSSH)
# 或 BackupList.txt 里给单个条目加 :encrypt(如 Edge :encrypt)
#
# 口令本身按以下优先级获取(见 README「加密」):
# 1. -Password 命令行参数
# 2. $env:BAKNRET_PASSWORD
# 3. PasswordFile 指向的文件首行 —— 必须指向仓库**之外**的文件;
# 出厂默认值留空:默认值指向仓库里的某个文件,等于鼓励把口令放进版本库
# 4. 交互式询问(仅交互式会话;计划任务里不会停下来等输入)
# 全都拿不到时该条目明确失败,绝不退化成明文归档。
#
# 注意 7z 只接受命令行口令,口令在本机进程列表里短暂可见,这是 7z 本身的限制。
Encryption = @{
Enabled = $false
PasswordFile = ''
EncryptHeaders = $true
}
# 安全描述符(NTFS 属主 / ACL)。
#
# 归档格式装不下它:7-Zip 的 -sni 官方说明是"当前版本只能写进 WIM 归档",
# .7z 里一个字节的 ACL 都没有。所以每个归档旁边多一个 <归档名>.acl.json,
# 恢复时按它把属主 + 属组 + DACL 回放回去。
#
# 为什么非要不可:C:\ProgramData 的 ACL 里有 (A;OICIIO;GA;;;CO) —— CREATOR OWNER
# 不是账户,是访问检查时才替换的占位符,替换成"被检查对象的属主"。只回放 ACE 文本、
# 不恢复属主,等于把"谁创建的东西谁有全权"里的"谁"换成跑恢复脚本的那个账户,
# 原程序(服务账户 / 专用用户)反而没了读写权限。
#
# Mode Off —— 完全不采集:恢复出来的属主/ACL 是新建对象的默认值
# Full —— 每个对象都存(默认;正确性优先,几万文件的树 sidecar 几 MB)
# Smart —— 只存"继承复现不出来"的对象(体积优化,判据见代码,终究是启发式)
# Roots —— 只存每个归档项的根(最省,适合权限只在根上的场景)
# IncludeSacl 是否连审计规则(SACL)一起存取;读/写它需要 SeSecurityPrivilege
# SidMap 跨机恢复时的 SID 映射,例如:
# @{ 'S-1-5-21-1-2-3-1001' = 'S-1-5-21-9-8-7-1001' }
# FailOnError 安全描述符写盘失败时,是否把该条目算作失败(默认只告警并记进 manifest)
Security = @{
Mode = 'Full'
IncludeSacl = $false
SidMap = @{}
FailOnError = $false
}
# 所有条目都生效的排除模式,语法同 BackupList.txt(! 开头 = 任意层级匹配组件名)
DefaultExcludes = @(
'!Thumbs.db'
'!desktop.ini'
)
}