Windows 磁盘空间体检
Windows 系统盘空间诊断的完整工作流。核心价值不是"清理",而是"用证据指认元凶"——告诉用户到底是哪一个进程/目录在持续吃掉空间,以及哪些东西看起来能删其实不能删。
> 一次交付 = 一个能双击就用的文件夹。 体检的产出固定是:① 商务风 HTML 诊断报告;② 可双击运行的清理工具包 —— clean-Tier1.ps1 + 中文双击启动器 clean-Tier1-launcher.cmd + space-report.ps1 + space-report-template.html,五件同目录。
> 脚本默认 dry-run,什么都不删;要真动手必须显式 -Execute + 管理员权限 + 输入大写 YES 确认。使用者不需要自己开管理员窗口 —— 启动器会自动弹 UAC(R-18)。
铁律(违反必返工)
- R-01 第一轮只做只读扫描,绝不删任何文件。 报告出来后由用户指定删哪些。即使用户说"帮我清理",第一轮也先出清单。
- R-02 必须跳过 reparse point(联接点 / junction)。 否则
C:\Users\All Users(→ProgramData)、AppData\Local\Application Data(自指)会造成重复计数。实测同一目录差 6.8 GB。 - R-03
.ps1脚本一律纯 ASCII 写。 Windows PowerShell 5.1 读无 BOM 的 UTF-8 脚本会按 ANSI 解析,中文注释/字符串直接导致语法崩溃(典型报错:","后面缺少表达式、意外的标记"10:N1"、字符串缺少终止符)。需要中文输出就写文件再读。 - R-04 体积统计用「整树走一遍、按深度聚合」,不要对每个子目录单独递归。 后者在 Temp 这种几千子目录的场景下几乎跑不完。
- R-05 「增长」口径要诚实。 「近 N 天修改过的文件体积合计」度量的是活动强度(churn),含覆盖写入,不等于净增量。报告里必须写明,净增量要另找可辨认事件(新增补丁包、新日志文件)。
- R-06 交付清理脚本时,dry-run 必须打印「可直接复制的下一步命令」。 只写一句"加 -Execute 就能清"是不够的——用户会误以为脚本"只列计划就退出了"。dry-run 结尾必须给出带完整路径、可直接粘贴的
-Execute命令行,并注明需要管理员窗口、-Yes可跳过确认、以及"不加 -Execute 永不删除"。脚本会把自身路径($MyInvocation.MyCommand.Path)填进该提示,中文路径必须用双引号包住。 - R-07
-Execute必须具备交互式确认闸门。 先完整打印计划 → 再要求输入大写YES→ 才动手;-Yes用于无人值守场景绕过。删除动作永远发生在计划打印之后(因此扫描与删除必须分两趟结构,不能边扫边删)。 - R-08 脚本必须自证"正常结束"。 结尾必须打印
[ FINISHED ] ... exit code 0横幅 + 耗时,并写结果日志。没有结束标记的脚本,用户一定会把"跑完了"读成"崩了"——本次实况。诊断一个"疑似早退"的脚本,用这三条判据:① 末尾有 FINISHED 横幅;② 结果日志被写出(日志是脚本最后几条语句);③ 调用方在脚本返回后还能继续执行(例如能打印出自身的耗时行)。三条齐 = 脚本跑到底了,问题在感知不在代码。 - R-09 交付给非技术用户的 Windows 脚本,必须附
.cmd启动器。.ps1没有文件关联,双击不会运行;而从编辑器/GUI 拉起时控制台又会一闪而过(脚本正常结束 → 窗口关闭 → 看起来像"意外退出")。启动器负责四件事:Unblock-File(清 Zone.Identifier)、结束时按需停顿、需要时 UAC 提权、跑完自动接后续动作。⚠️ 停顿用-Pause/-NoPause精确控制,不要用-NoExit——-NoExit会把用户丢在一个 PowerShell 提示符里。启动器只允许 ASCII 或 GBK(cp936) 两种编码,且路径一律用%~dp0运行时求值、绝无中文路径字面量(中文菜单的编码口径见 R-18)。 - R-10
Read-Host必须 try/catch 包裹,中止路径绝不用exit。 非交互 shell 下Read-Host会抛PSInvalidOperationException把脚本打死(-NonInteractive必现;$ErrorActionPreference='SilentlyContinue'也挡不住)。要捕获并给出"请改用-Yes"的明确指引。中止用return语义,不要用exit——若用户是点源(. script.ps1)执行,exit会把他整个 PowerShell 窗口一起关掉。 - R-11 给脚本做"防误删回归测试"时,一律用 ASCII 路径的副本运行。 测试脚本里写中文路径字面量 = 自己踩 R-03(实测路径被解成乱码,4 组测试全部空跑)。正确做法:把真实路径通过环境变量(
$env:X,走 UTF-16 传递,安全)传进纯 ASCII 的测试脚本。 - R-12 清理企业管控 agent 时,只删「可再生缓存」,绝不碰「策略文件」「数据库」与「日志」。 可删:
@@partial@@_*(下载中断残包)、*.msu(已取回的补丁包,agent 需要时会重下);禁删:ldappl3.INI/ldappl3.BAZ(agent 策略与备份)、C:\ProgramData\Sentinel\data(EDR 数据库)、agent 程序体、SentinelOne_*.binlog(日志类,默认只统计不删)。⚠️ 两条踩坑教训:①*.BAZ这个模式看着像"备份垃圾",实测会命中ldappl3.BAZ—— 写 Filter 前必须把实际命中的文件名打印出来核对,不能靠扩展名想象;② 日志与缓存要分开判——缓存可再生(删了会重下),日志有取证/审计价值(删了不可追)。拿不准时默认不删,把选择权交回用户。 - R-13 体积回落必须先归因,不能想当然认定「自动轮转 / 自限制」。 看到某目录从 23.5 GB 掉到 90 MB,先问用户"这是不是你手工清过 / 重启过",再下结论。鉴别判据:真正的自轮转有稳定的保留上限与固定命名序列(如恰好 5 个满包),需观察 2~3 个周期才能确认;做不到这一点就一律按「持续增长、会复发」处理。
- R-14 生成脚本需要输出中文时,中文必须来自模板的 L10N 块,脚本里一个字都不能写。 用
<!--L10N\nKEY=中文\nL10N-->把文案存进模板,脚本解析成字典再拼装动态片段,最后把 L10N 块从输出里剥掉。判据:[System.IO.File]::ReadAllBytes($f)里 >127 的字节数必须为 0——每次改完脚本都跑一次,别信眼睛。 - ⚠️ L10N 块的解析实现有两个坑:① 换行必须支持——值里含全角括号
(时,若模板里把长文案折了行,旧解析器会把续行当新键丢掉,值被静默截断成空串。判据:L10N 键必须"列 0 起头",续行必须缩进。② 变量定义顺序——L10N 字典必须在任何使用它的表/图之前加载完毕,否则前半部渲染出<span class="pill p2"></span>空徽章(语法检查仍然 0 错误,极隐蔽)。→ 凡是"应为空则报错"的断言,都要在生成物上验,别只验语法。 - R-15 「只统计不删除」的行必须用
-NoDelete显式标记,并提供反向开关,默认落在"不删"一侧。 涉及日志 / 取证数据 / 策略未定的项目,哪怕 IT 说零风险,脚本默认也不动手:打印为[info] ... (report only - NOT deleted),报告状态列渲染成「只统计·不删除」徽章。要恢复删除必须显式加-IncludeSentinelLogs之类的开关。理由:默认不删的成本是"少回收几个 GB",默认删的成本是"不可逆的用户数据损失"——两者不对称,必须选保守侧。报告里也要把「实际删除=0」说成设计如此,否则用户会当成脚本失效。 - R-16 报告的 hero 文字与正文必须共用同一条左基线。 做法是让两个内容框同宽同起点:
.hero-inner的水平padding=.wrap水平padding+section边框宽 +section水平padding。朴素版 section(无卡片)为24px;卡片化 section(如border:1px solid+padding:28px 30px)为55px(此时两边内容框都是970px)。实测:生成报告时给section加了padding:28px 30px而.hero-inner仍是padding:0 24px,1440 视口下顶部标题left=204、正文left=235,顶部文字整体左偏 31px。判据(不许靠肉眼):渲染后量.hero h1与首个section正文(h2/.sec-desc)的getBoundingClientRect().left,必须相等(朴素版基准204,卡片版基准235)。见references/report-style.md「左基线对齐」。 - R-17 体检报告出来的同一轮,必须一并交付可直接运行的清理工具包。 报告 +
clean-Tier1.ps1+ 双击启动器clean-Tier1-launcher.cmd+space-report.ps1+space-report-template.html构成一个交付单元,缺件即判本次未完成——只给清单不给工具,等于把落地动作推回给使用者。脚本默认 dry-run;本轮确无 Tier 1 可清项时,在报告里明写"本次无需清理"。 - R-18 工具包必须"落到使用者手边",启动器要让零基础用户"双击即可"。 三条硬判据:
1. 同目录交付——报告 HTML 生成在哪个目录,clean-Tier1.ps1/clean-Tier1-launcher.cmd/space-report.ps1/space-report-template.html就复制到哪个目录。工具留在安装目录(用户找不到)判交付失败。
2. 启动器自解释——菜单用中文,写成"第 1 步 / 第 2 步"的行动指引,不要只写功能名(dry run/preview对零基础用户等于天书);进入"清理"后先做一次中文pause确认,再用中文预告接下来会遇到什么(会弹 UAC → 点【是】→ 新窗口要求输入大写YES)。用户在任何一步关掉窗口都不得造成删除。
3. 提权由启动器代劳——用Start-Process -Verb RunAs -Wait自动弹 UAC,用户不需要知道"以管理员身份运行"这件事。这正是"零基础用户不会开管理员窗口"的解法。 - ⚠️ 编码:
.cmd不受 R-03 约束(那是.ps1的坑)。启动器采用 GBK(cp936) 存盘 + 首行chcp 936承载中文菜单(目标系统为中文 Windows,默认 OEM 代码页 936);路径一律用%~dp0运行时求值,绝不写中文路径字面量,装在任何中文路径下都不会乱码。若落到非中文系统,症状是菜单显示乱码、脚本仍能正常执行(中文只作显示文本)。 - ⚠️ 大小写一致性:包内文件名统一为
clean-Tier1.ps1/clean-Tier1-launcher.cmd(大写 T)。Windows 文件系统不敏感,但解到 Linux/WSL 就会 404,且启动器内部引用、SKILL.md 引用、README 引用三者必须逐字一致。 - ⚠️ 同步陷阱:
Copy-Item覆盖一个"大小写不同但等价"的同名文件时,磁盘上存储的大小写不会更新(NTFS 保留原名),而 md5 只比内容、比不出大小写——所以"md5 全一致"不等于文件名一致。改名要用"临时名 → 目标名"两段式,同步后单独列出两边文件名逐个比对。
四类结论必须给出
一次合格的体检报告至少回答这四个问题:
- 空间在哪——顶层目录 + 深挖到 2~4 层,带体积排序。
- 谁在飞快增长——近 7/14 天写入排行 + 文件级证据(具体文件名、体积、时间戳、增长节奏)。
- 哪些能安全删——三级清单(见下)。
- 怎么治本——不只清一次,要给防止复发的机制。
三级清单分级准则
| 级别 | 判据 | 典型例子 |
|---|---|---|
| Tier 1 低风险 | 可再生的缓存/临时/日志/安装包残留 | %LOCALAPPDATA%\Temp、SoftwareDistribution\Download、Windows\Logs\CBS、$WinREAgent、npm/pip/uv cache、更新器 crx_cache |
| Tier 2 需评估 | 涉及系统行为、企业 IT 管控、或应用自有数据 | hiberfil.sys(用 powercfg)、pagefile.sys(限上限别关)、企业管控补丁缓存、EDR 日志、AV 定义库、旧版本程序目录、应用缓存 |
| Tier 3 禁止手删 | 删了会坏 | Windows\WinSxS(用 DISM)、Windows\Installer、System32/DriverStore、Outlook .ost、安全代理本体、用户文档 |
判据心法:问「删掉后谁会变」——会坏的进 Tier 3,会重新下载的进 Tier 1,要审批/会影响合规的进 Tier 2。
企业管控机的特殊处理(重要)
遇到同时装着 Ivanti EPM / SentinelOne / Symantec SEP / LANDesk / Malwarebytes / CrowdStrike 这类公司 IT 推送的管控软件时:
- 它们往往吃掉 10~30 GB,且不受用户控制(补丁缓存策略、日志轮转上限都是 IT 侧配置)。
- 默认不要建议用户自行删除,先建议提 IT 工单并明确指出诉求(如「补丁缓存里同一补丁存了两份,冗余 8.85 GB,请调整缓存保留策略」)。
- 要把「可再生缓存 / 滚动日志」与「agent 状态」分开判:前者(补丁包与下载残包)在用户与 IT 核实后可纳入 Tier 1 自动清理;后者(策略文件
ldappl3.*、EDR 数据库、agent 程序体)永远列入 Tier 3。 - ⚠️ 日志类默认只统计、不删。 判断心法:补丁包缓存(可再生)≠ 日志(有取证/审计价值)。日志要不要清,是使用者的策略决定,不是技术判断;IT 说的"零风险"只解除安全顾虑,不解除策略顾虑。实现方式:
-NoDelete标记 + 反向开关(默认关)。 - 这两类目录会「一直涨」,不会自己清。 实测:EDR binlog 约每半小时新增 100 MB(≈ 4.8 GB/天);企业补丁缓存每个补丁周期新增约 8.85 GB。→ 报告里要明确写"属会复发型,需定期复查",不能只出一次性清单。
- 高价值发现:同一个补丁包被存两份(一份哈希命名、一份
tw#####-#####命名)——这是 Ivanti EPM 的常见现象,值得单独点出来。
已知的"空间刺客"清单(优先查这几处)
%LOCALAPPDATA%\Temp—— 尤其 iSlide Tools(每次编辑 PPT 整份复制进 Temp,单文件可达 460 MB 且留多份)、Outlook Logging(每个 .etl 恰好 50 MB)。- EDR/杀软的 binlog:
SentinelOne_*.binlog固定 100 MB/个、约半小时一个 → 每天约 4.8 GB,且不会自己轮转清理。⚠️ 属日志类,报告里只统计、不清理。 - 企业补丁缓存:
Ivanti\EPM Agent\sdmcache、Windows\SoftwareDistribution\Download。sdmcache每个补丁周期吃约 8.85 GB,可涨到 23.5 GB+,不会自行回落;其中@@partial@@_*残包与*.msu属可再生,策略文件ldappl3.*不碰。 - 应用自动更新多版本并存:Edge(EdgeCore / Edge / EdgeWebView / Optimized 四处各落一份 332 MB)、WeMeet、夸克、钉钉(
current+current_new)、豆包(Application+User Data\update_data)。 hiberfil.sys+pagefile.sys(合计常达内存 1.5~2 倍)。Windows\WinSxS+Windows\Installer。ms-playwright、npm-cache、pip、uv这类开发缓存。- Outlook
.ost(随邮件量线性增长)。 $WinREAgent(系统更新遗留)。AppData\Roaming\Microsoft\PowerPoint的崩溃自动恢复残留。
执行流程
第 1 步:一次遍历、多维度聚合(核心脚本)
用 scripts/scan-disk.ps1。它按「整树走一遍 + 按深度聚合」实现,一次拿到 depth1~4 的体积排行、近 14 天写入排行、>150 MB 大文件清单。
# 结果落在 $env:TEMP\disk_scan_<drive>.txt
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\scan-disk.ps1 -Drive C
跑完用 Read 读回文本文件(不要指望 stdout 回显)。全盘约 90 万文件耗时 10 分钟左右,放后台跑。
第 2 步:按需补刀
主扫描拿不到的,再用小脚本补:
- 常见热点清单(Temp / SoftwareDistribution / Installer / Prefetch / 回收站)——快速版,秒级。
- 受保护目录(
Program Files\WindowsApps会因 ACL 返回 0,必须说明而非当 0 处理)。 - 特定应用的深度下钻(某个目录为什么这么大)。
第 3 步:核账
顶层各目录体积之和 vs Get-PSDrive C 的 Used,差额要解释清楚。常见差额来源:
Program Files\WindowsApps(ACL 全锁,读数为 0)- NTFS 元数据(文件数上百万时 MFT 本身就有数 GB)
- 卷影副本 / 系统还原点(用
Get-CimInstance Win32_ShadowCopy计数,为 0 即可排除这一嫌疑) - WinSxS 硬链接(朴素求和会高估)
差额超过 5% 就要在报告里单列说明,不能装作没看见。
第 4 步:出报告 + 一键清理工具包(同目录交付)
> 硬要求:报告出来的同时,必须交付一个可直接双击使用的工具文件夹,五件套齐:① 诊断报告 C盘空间体检报告-<日期>.html;② clean-Tier1.ps1;③ clean-Tier1-launcher.cmd(零基础用户的双击入口);④ space-report.ps1;⑤ space-report-template.html。
> ①②③④⑤ 必须落在同一个目录(默认 = 报告所在目录)。使用者的全部操作就是「双击 ③ → 按 1 预览 → 按 2 清理」,不需要自己开管理员窗口、不需要敲任何命令。只给报告不给工具 = 本次交付未完成(R-17);工具留在安装目录 = 等于没给(R-18)。本轮确实无 Tier 1 清理项时,在报告里明写"本次无需清理",而不是略过不提。
- 报告:白底 + 深海军蓝
#0B2545+ 金#C9A961商务风单页 HTML(含 KPI 卡、纯 CSS 条形图、可筛选的三级清单表格、分步方案、口径边界表)。不输出 PDF(点开即看、随时转发)。版面与配色的唯一标准是references/report-style.md——出任何报告 HTML 前先读它,照抄其组件与骨架,不要临时另起一套风格。 两个最易漏的点:① 左基线对齐(R-16)——hero 内层容器必须与.wrap同宽同内边距,section不得私自加水平内边距;② PLAN section 末尾必须有「下一步:一键清理」块(.next,R-18),用中文写清"双击哪个文件、按几、会发生什么"。 - 清理脚本:
clean-Tier1.ps1(v1.5),默认 dry-run,必须显式加-Execute且管理员权限才动手。只碰 Tier 1,Tier 2/3 一律不碰并在末尾列出「需另行处理」清单。开关:-Execute(真删)/-Yes(跳过确认,供无人值守)/-Pause·-NoPause(强制/禁用结束等待)/-SkipAgentCache(跳过 Group 7 企业管控缓存)/-IncludeSentinelLogs(默认关,打开才删 EDR 日志,见 R-12/R-15)/-KeepTraceDays N(日志保留天数,默认 7)。结果日志默认写%USERPROFILE%\clean-tier1-last.log(注意别写进 Temp,否则自己会被自己清掉)。七个清理组:1 用户 Temp/2 Windows 日志与更新缓存/3 安装器与更新器残留/4 开发缓存/5 应用 traces 与 logs/6 回收站/7 企业管控 agent 缓存(当前实际只删补丁缓存;EDR binlog 为 report-only 行,见 R-12/R-15)。-Filter支持分号分隔多模式(OR)。 - 启动器:
clean-Tier1-launcher.cmd(双击入口,见 R-09 / R-18)。中文菜单,四选一:1先预览(只列清单、绝不删)/2开始清理(自动 UAC 提权 → 弹窗点【是】→ 新窗口输入大写YES→ 跑完自动出对比报告)/3只出对比报告/4退出。进"清理"前先pause用中文再确认一次,并在动手之前用中文预告"会弹授权窗口、点【是】、再输 YES"。预览与清理都用-NoPause、由启动器自己收尾(不用-NoExit,否则会把用户丢在一个 PowerShell 提示符里),提权那次用-Pause保证弹窗窗口不闪退。启动器先Unblock-File再跑。文件名大小写必须与包内实际文件逐字一致(R-18)。 - 运行前后对比报告:
space-report.ps1+space-report-template.html(两者随报告同目录交付)。clean-Tier1.ps1每次运行(dry-run 也算)都会往%USERPROFILE%\clean-tier1-history.jsonl追加一行 JSON 快照(模式、空闲量前后、逐组的计划量 vs 实际删除量 vs 成功/锁定数);space-report.ps1读该文件渲染成商务风单页 HTML。头部取「最近一次未中止的 EXECUTE」,若还没有执行记录则取最后一次运行并整体标注为「预览态」。⚠️ 没有历史文件时它只打印一行提示就返回、不产 HTML(退出码 0,不是崩溃),所以首次使用必须先跑一次clean-Tier1.ps1再看报告。 - 通用解法(值得跨技能复用):脚本纯 ASCII,全部中文文案放进独立的 HTML 模板(模板用
Get-Content -Raw -Encoding UTF8显式读取,所以无 BOM 也安全);正文/单位/百分比这类文案写死在模板里,脚本只注入数字与表格行;两种状态(预览 vs 执行)用{{CLS_DRY}}/{{CLS_EXEC}}两个类名切换hidden,避免脚本里出现任何中文。 - 脚本要往动态片段里塞中文时走 L10N 块(R-14):模板里放
<!--L10N … KEY=中文 … L10N-->,脚本解析成字典供拼装用,最后把该块从输出剥掉。占位符与脚本 map 的键必须双向零差集,脚本会自动告警未填充的{{...}}。⚠️ L10N 字典必须在文件靠前处加载(在任何表/图生成之前)。模板里若要写一个字面@(如选项名),写@@—— 脚本在占位符替换之后统一还原。 - 记账口径:每条目单独记「实际删除字节数」(成功删一个累加一个),不要只用磁盘空闲量前后差值——后者会被同期写入抵消,导致报告失真。report-only 行的「实际删除」恒为 0,须在报告里注明"设计如此",否则用户会认为脚本没干活。
# 预览(安全,什么都不删)
powershell -NoProfile -ExecutionPolicy Bypass -File .\clean-Tier1.ps1
# 真清(必须管理员窗口)
powershell -NoProfile -ExecutionPolicy Bypass -File .\clean-Tier1.ps1 -Execute
# 无人值守
powershell -NoProfile -ExecutionPolicy Bypass -File .\clean-Tier1.ps1 -Execute -Yes
第 5 步:交付前自检(清理脚本必做)
| # | 检查项 | 判据 |
|---|---|---|
| 1 | 纯 ASCII | 脚本非 ASCII 字节数 = 0 |
| 2 | 语法 | [PSParser]::ParseFile 报 0 错误 |
| 3 | 干运行 | 实跑一次,末尾出现 [ FINISHED ] 横幅 |
| 4 | 防误删回归 | -Execute 分别喂「空答案」和「错误答案」,必须中止,且前后 (Get-PSDrive C).Free 不变(这是唯一能证明"确认闸门有效"的方法,不能靠读代码拍胸脯) |
| 5 | 非交互 | -NonInteractive 下跑 -Execute,必须给出明确指引而非崩溃 |
| 6 | 启动器 | 喂「非法选项 + 退出」应能循环回菜单并正常退出 |
| 7 | 新清理组命中复核 | 新增 Filter/路径后,必须在 dry-run 输出里核对实际命中的文件名与体积,确认没有误伤(实测教训:*.BAZ 会命中 ldappl3.BAZ)。见 R-12 |
| 8 | 对比报告 | 跑一次 space-report.ps1,输出 HTML 里不得残留 {{...}} 占位符;{{CLS_DRY}}/{{CLS_EXEC}} 两个状态块只应有一个可见 |
| 9 | 报告视觉标准 | 对照 references/report-style.md:只用令牌配色;每个 section 有英文小标 + sec-desc 口径说明;KPI 卡三行完整;条形图宽度数据驱动且图例一致;数值列右对齐;@media 断点带 screen;L10N 块已剥离;模板与脚本键双向零差集 |
| 10 | 顶部左基线 | hero 内层容器(.hero-inner)与 .wrap 同 max-width + 同水平 padding;section 无水平内边距;渲染实测 .hero h1 的 left == 首个 section 正文的 left(1440 视口基准 204)。见 R-16 |
| 11 | 工具包同目录 | 报告 HTML 所在目录内必须同时存在 5 件:报告 + clean-Tier1.ps1 + clean-Tier1-launcher.cmd + space-report.ps1 + space-report-template.html;缺件即判未完成。见 R-17 / R-18 |
| 12 | report-only 行为 | 标记 -NoDelete 的行:-Execute 下必须不删(前后 (Get-PSDrive C).Free 不变,且 deletedMB=0);报告状态列渲染成「只统计·不删除」而非空徽章;显式加反向开关后应恢复为可删行 |
| 13 | L10N 渲染断言 | 出件后 grep 生成物:不得出现 <span class="pill p2"></span> 这类空徽章(= 变量未定义),不得残留 @@。语法 0 错误不代表值取到了 —— 必须在生成物上断言(R-14 第②坑) |
| 14 | 零基础可用性(启动器实测) | 把 clean-Tier1-launcher.cmd + clean-Tier1.ps1 + space-report.ps1 + 模板复制到一个 ASCII 路径的空目录(模拟用户文件夹,R-11)实跑:① 菜单中文不乱码;② 选 1 出预览并能回到菜单;③ 无历史时选 3 给中文提示而非崩溃;④ 选 4 正常退出;⑤ 启动器内部引用的文件名与目录内实际文件大小写逐字一致 |
| 15 | 一键清理块 | 报告 PLAN section 末尾有 .next 块;块内文件名与随附实际文件逐字一致(含大小写);按键顺序为"先 1 预览、后 2 清理"(R-18) |
参照 R-11:第 3~6、14 项一律在 ASCII 路径的副本上跑。
常用命令备忘
# 休眠文件降级(保留快速启动,约省一半)
powercfg /h /type reduced
# 完全关闭休眠(省全部)
powercfg /h off
# 组件存储清理(管理员)
DISM /Online /Cleanup-Image /StartComponentCleanup
# 加 /ResetBase 更彻底,但之后已装更新无法卸载
DISM /Online /Cleanup-Image /StartComponentCleanup /ResetBase
# 卷影副本占用(管理员)
vssadmin list shadowstorage
# 卷影副本计数(普通权限可跑,用来排除嫌疑)
Get-CimInstance Win32_ShadowCopy | Measure-Object
参考
references/report-style.md—— 报告视觉规范(出任何报告 HTML 前必读)。设计令牌、版面骨架(含「左基线对齐」)、组件库、响应式与打印、生成器工程约束、交付前检查清单。scripts/scan-disk.ps1—— 主扫描器(单次遍历、按深度聚合、跳过 reparse point,纯只读)。scripts/clean-Tier1.ps1—— Tier 1 清理器(默认 dry-run,v1.5,7 组;每次运行写一行历史快照)。交付时复制到报告目录。scripts/clean-Tier1-launcher.cmd—— 双击启动器(R-09 / R-18)。GBK(cp936) 中文菜单:先预览/开始清理并自动出报告/只出报告/退出。交付时复制到报告目录。scripts/space-report.ps1—— 运行前后空间对比报告生成器(读clean-tier1-history.jsonl)。交付时复制到报告目录。scripts/space-report-template.html—— 对比报告的中文模板({{占位符}}+<!--L10N-->文案块,UTF-8)。交付时复制到报告目录。
经验沉淀
发现新的"空间刺客"、新的踩坑、新的分级判例时,按以下方式回写:
- 可复用的规则 → 直接补进本 SKILL.md 的铁律区(R-18、R-19…),保持编号连续。
- 过程与证据 → 记在技能目录下的
NOTES.md(自建,不随包发布)。 - 每条经验必须带判据(怎么验证)与触发条件(什么场景会遇到),只写"要注意 XX"不算沉淀。