Windows 系统盘扫描与清理
把「磁盘满了/清理 C 盘」类请求拆成三步:扫描 → 报告 → 执行(经用户确认)。环境假设:Windows + Git Bash(ZCode 默认 shell);流程已在无管理员权限的会话中验证过。
工作模式
| 用户意图 | 行为 | |---|---| | "看看占用 / 哪些能删 / 哪些能迁"(分析) | 只扫描 + 报告,不动任何文件 | | "帮我清理 / 执行 / 继续清理"(已看过报告或明确授权) | 按分级执行,边做边汇报 | | 新对话里直接要求清理 | 默认先扫描报告;用户明确说"直接删"才跳过 |
红线(先记住)
- 不确定就不删——说不清用途的目录写进报告让用户判断,不放进删除清单。
- 系统组件不手动删:
Windows\WinSxS(只能用 DISM)、Windows\Installer(只能用 PatchCleaner 的 Move 模式)、ProgramData\Package Cache(修复/卸载依赖)。用户要求清 WinSxS 时也只给 DISM 命令。 - 缓存优先"迁移"而非"删除":用户有数据盘时先改配置 + robocopy 搬运,空间同样腾出来,且保留缓存价值。
- 删除前检查占用:清某应用的缓存前先看它是否在运行(VS Code 的缓存必须在 Code 关闭时清)。
- 每个删除批次后复查残留,报告如实说明哪些没删掉、为什么(最常见:文件被占用、需要管理员权限)。
第一步:扫描
- 驱动器总览 + 根目录大文件(pagefile/hiberfil/swapfile 可能占数 GB)——命令见
references/scan-commands.md。 - 并行扫主要目录(增量输出、后台跑):
大目录扫描是分钟级:一律bash <skill目录>/scripts/scan.sh c # C 盘一级分布(含 $Recycle.Bin 等隐藏目录) bash <skill目录>/scripts/scan.sh u # 用户目录 + AppData Local/Roaming/LocalLow bash <skill目录>/scripts/scan.sh d "/c/Program Files" # 任意目录的子项run_in_background: true+timeout: 600000,完成后读输出文件,中途也可读日志看进度(脚本把>> 目录 ...进度打到 stderr,stdout 只有结果行,可用进度提示判断是否卡住)。补扫Program Files、Program Files (x86)、ProgramData、Windows 清理候选(命令在 scan-commands.md)。 - 核对已知重灾区:读
references/cleanup-targets.md逐项确认存在性和实际大小——清单覆盖开发者机器上绝大多数空间黑洞。 - 交叉找卸载残留:导出注册表已安装程序清单(scan-commands.md),与 AppData/ProgramData 目录名交叉对比(有目录、无程序 = 残留)。
- 顺带确认:WSL/Docker 虚拟磁盘的实际位置(常是几十 GB 级大头)、用户 dotfiles(.cargo/.rustup/.cache/.vscode)、根目录可疑残留(
C:\AMD、随机名目录等)。
第二步:报告
按「行动建议」分组,不要按目录罗列。结构:
- 总览:盘容量/剩余 + 大头分布表
- 立即可删(缓存类,自动重建):大小 + 一句"为什么安全"
- 建议迁移到数据盘:大小 + 具体方法(命令或操作路径)
- 卸载残留:目录 + 判定依据
- 需要工具/谨慎处理:PatchCleaner、DISM、重复安装的程序等
- 明确不动的:Package Cache、WinSxS 等,写清原因
写实际数字(3.2G 而不是"很大"),用表格,跟随用户语言。示例:
| 位置 | 大小 | 说明 |
|---|---|---|
| Windows\Installer 孤立文件 | 10.7G | 已卸载软件的 MSI 缓存,用 PatchCleaner 移到 D 盘 |
| npm 缓存 | 3.2G | 删除后下次安装自动重下;建议迁移到数据盘 |
第三步:执行清理
- 多步操作先建 TodoWrite 清单(每项:目标 → 执行 → 验证)。
- 删除统一
rm -rf ... 2>/dev/null+ 删除后复查;个别锁定文件失败属正常,如实汇报。 - 具体命令与每类目标的处理方式:
references/cleanup-targets.md。 - 迁移配置(npm/pnpm/yarn/pip/uv/cargo… + robocopy 搬运 + 逐项验证):
references/cache-migration.md。 - 权限受限(C 盘根目录、驱动文件,报
Permission denied/Access is denied):用scripts/elevated-remove.ps1走 UAC 提权:会弹 UAC 窗,需用户点击确认;如果用户不在场,把命令交给用户自行运行。powershell -NoProfile -Command "Start-Process powershell -Verb RunAs -ArgumentList '-NoProfile','-ExecutionPolicy','Bypass','-File','<skill目录>/scripts/elevated-remove.ps1','C:\AMD'" # Start-Process 立即返回:Start-Sleep 10~20 秒后再验证 Test-Path
收尾
- 前后对比磁盘空间(
Get-PSDrive C),汇报实际释放量和未处理项。 - 提醒生效条件:
setx环境变量需新终端;GUI 类操作(PatchCleaner、微信改存储路径)留给用户并给出步骤。 - 若存在记录清理状态的记忆/项目文档,更新已执行与未执行项。
Scan to join WeChat group