从 8.86 GB 到 39 GB:我把一台 Win11 笔记本的 C 盘救回来了
一台两年的 Win11 笔记本,C 盘 119 GB 只剩 8.86 GB,比 7% 还少。
三阶段、两个坑,最终腾到 39 GB(33%)——4.4× 提升。
这是完整的清理手记,含关键技术点、脚本片段和踩坑复盘,发出来希望能帮到同样手忙脚乱的人。
TL;DR
| 指标 | 优化前 | 优化后 |
|---|---|---|
| C 盘总量 | 119 GB | 119 GB |
| 已用 | 110 GB | 80 GB |
| 可用 | 8.86 GB(7.4%) | 39 GB(33%) |
| 警告线(10%) | 已触线 | 安全 |
三阶段释放构成
| 阶段 | 内容 | 风险 | 释放 |
|---|---|---|---|
| 阶段 0 | 浏览器/办公/IDE/AI 工具缓存 | 零(备份可回滚) | ~11 GB |
| 阶段 1 | 系统还原、WinSxS、WDAG、pagefile、事件日志 | 低(需管理员) | ~13 GB |
| 阶段 2 | 用户级 Python 包、AI 工作区、VS/SDK 迁移 | 中(迁错可回滚) | ~8 GB |
一、先看体检报告
动手前先扫一遍状态。我用了 PowerShell + Bash 的混合脚本,只读不写:
1 | C 盘总量 : 119 GB |
症结很明显:数据全都堆在 C 盘,D/E 盘空着没人用。最直接的修法是”先备份后删除” + “把可外迁的应用迁出去”。于是我定了三阶段路线图,每个阶段都能停下来观察、能回滚。
二、阶段 0:缓存清理(~11 GB)
最稳的肥肉是各路缓存。清单:
- Chrome 模型缓存:2.67 GB
- 钉钉缓存:~2.3 GB
- WPS 残留:~2.7 GB
- 微信插件:0.41 GB
- 回收站:5.41 GB(单独拎出来清,下面会讲为什么)
- Gradle / pnpm / npm / pip 包管理器缓存:合计 ~1 GB
关键技术:robocopy 备份 + 返回码校验
每个目标走同一套流程:
1 | # 1) 备份到 E 盘 |
阶段 0 的两个坑
坑 ① 算大小挂死:第一版脚本用
Get-ChildItem -Recurse -File算文件夹大小,挂在某个目录 26 分钟零输出。教训是——robocopy 直备不需要算大小,返回码就是校验结果。
坑 ② 漏了回收站:阶段 0 跑完,C 盘反而”变小”了。根因是脚本漏了
Clear-RecycleBin,且用户会话期间回收站又涨了。清单里必须单列回收站。
回收站单独清一行就够:
1 | Clear-RecycleBin -DriveLetter C -Force |
三、阶段 1:系统级优化(~13 GB)
这一步需要管理员权限,每个子项可以独立开关。
A. 系统还原影子存储上限 → 3 GB(释放 ~8 GB)
Windows 默认把 10%+ 空间预留给”系统还原影子副本”,日常根本用不上那么多。
1 | vssadmin Resize ShadowStorage /For=C: /On=C: /MaxSize=3GB |
B. DISM WinSxS 清理 + -ResetBase(释放几百 MB ~ 几 GB)
1 | dism /Online /Cleanup-Image /StartComponentCleanup /ResetBase |
-ResetBase会让系统无法再卸载旧更新,但能多清一些。前提是你这台机器已经稳了至少半年。
C. WDAG 容器镜像删除(3.94 GB)
Windows Defender Application Guard 是给 Edge 隔离浏览用的容器镜像,绝大多数人根本不开。如果你不用 Edge 隔离,直接清:
1 | # 1) 卸载功能 |
D. 事件日志清空(释放几十 ~ 几百 MB)
1 | wevtutil cl Application |
E. 页面文件:2 GB 固定(释放 ~5 GB)
观察到 pagefile 峰值只 ~1 GB,于是设成 2048 MB 固定:
1 | $cs = Get-CimInstance Win32_ComputerSystem |
坑 ③ CIM 类型不匹配:第一次脚本传
2048报”类型不匹配”。CIM 属性是uint32,PowerShell 默认int32,必须强转[uint32]2048。这个坑我们后面会再踩一次反作用。
NVIDIA 旧驱动:建议保留
本来想顺手清掉几个旧版本 NVIDIA 驱动,结果 dism /Online /Remove-Driver 直接报”错误 50:只能与脱机映像一起使用”——在线系统不能用 Dism 删驱动。Installer2 缓存 223 MB 我顺手清了,驱动本体保留。要清驱动请用 DDU 离线模式。
四、阶段 2:用户数据迁移与清理(~8 GB)
删除部分(~3 GB)
- Python 用户级包(torch / PyQt):0.84 GB
- AI 工具 node_modules(两个工作区):2.31 GB
先备后删,备份目录按日期归档,回滚无忧。
迁移部分(~5.87 GB):junction 透明重定向
把 VS 生成工具、SDK、VS Installer Package Cache 搬到 E 盘,C 盘留 junction 透明重定向:
1 | # 1) 复制到 E 盘 |
三个目标都一样处理:VS、SDK、Package Cache。
关键安全网:原目录改名不删,叫
*.relocated。如果 VS 出问题,可以瞬间回滚(删 junction + 删改名后缀)。观察几天没问题再单独跑p2_cleanup.ps1释放安全网。
迁移完成后 C 盘立刻多出 5.87 GB——junction 本身只占几个字节。
五、踩坑复盘:pagefile 干翻 Hyper-V
阶段 1 全跑完的第二天早上,开机发现 13.4 GB 内存的 Linux VM 启不来:
1 | "无法分配 13394 MB 的 RAM" |
这一路我走了三轮才彻底修好,每一轮的错误码都是进步信号:
| 错误码 | 含义 | 这一轮做了什么 |
|---|---|---|
| 0x800705AA | 系统提交预算不足 | 脚本把 pagefile 改成”系统托管”,重启 |
| 0x8007000E | 物理内存真的不够 | 脚本把 VM 改成 Dynamic Memory |
| InvalidState | VM 还在”已保存”状态,Hyper-V 锁内存配置 | 脚本先 Stop-VM -Force 再 Set-VMMemory |
根因复盘
这台机器 16 GB 物理内存,VM 想要 13.4 GB 固定 RAM。13.4 + 主机 ~3 + Hyper-V 开销 ~1 = 17.4 GB > 16 GB,物理上装不下,跟 pagefile 大小其实无关。
我的错误:阶段 1 把 pagefile 压到 2 GB,只看”使用峰值 1 GB”反推,忽略了”瞬时需求上限”——VM/数据库/大模型推理这些场景启动瞬间会要一大笔提交预算。
教训清单
- 资源上限类优化不能只看使用峰值,要先列出会被影响的典型负载(VM、数据库、大模型、视频剪辑……)
- 关键优化跑完主动做一次回归问询——“这次清理有没有把什么跑不起来?”,不要等用户当发现问题的第一人
- Hyper-V 改内存前必须把 VM 切到 Off 状态(Saved/Paused/Stopping 都不行),用
Stop-VM -Force自动丢弃保存状态 - 16 GB 机器跑大内存 VM 的最佳实践:VM 开 Dynamic Memory(启动 4 GB / 范围 2~12 GB),闲时把内存还给主机、忙时拿满,比”VM 固定吃满 + 主机等死”健康得多
修完后,VM 改成 Dynamic Memory,C 盘又涨了 5 GB(pagefile 改回系统托管)——最后的成绩是 C 盘 39 GB 收尾。
六、最终成绩单
1 | 阶段 释放 关键项 |
C 盘最终:8.86 GB → 39 GB(33%),4.4× 提升。
七、给同样手忙脚乱的人
- 先看体检报告再动手——别上来就清缓存,先
Get-PSDrive/du -h摸清楚大块在哪 - 三阶段路线图:零风险 → 系统级 → 结构性迁移,每阶段都能停
- 备份 > 删除——robocopy + 改名
.relocated安全网 > 直接rm -rf - junction 迁移比”删了重装”温和得多,尤其是 VS、SDK 这类对路径敏感的应用
- pagefile 不能拍脑袋压——先看这台机器跑什么负载
- 写 PowerShell 脚本处理路径一定要
-LiteralPath,路径里有(x86)这种括号不用-LiteralPath会出问题 - CIM 数值属性必须强转
[uint32],默认int32一定踩坑 - 交付给用户用
powershell -File跑的脚本,用 UTF-8 BOM + 纯 ASCII,避免本地 ANSI 编码解析失败 - Dism /Online /Remove-Driver 在线系统受限,要清驱动请用 DDU 离线模式
附录:本文用到的脚本
| 脚本 | 用途 | 权限 |
|---|---|---|
Stage1_SystemCleanup.ps1 |
阶段 1 主脚本(A 还原 / B pagefile / C WinSxS / D NVIDIA / E WDAG / F 日志) | 管理员 |
p1_fix_pagefile.ps1 |
pagefile 修复(含 [uint32] 强转) |
管理员 |
p1_fix_pagefile_hyperv.ps1 |
pagefile 恢复 + 系统托管选项 | 管理员 |
p2_migrate.ps1 |
VS / SDK / Package Cache 迁移(robocopy + junction) | 管理员 |
p2_cleanup.ps1 |
删除 *.relocated 安全网(先校验 junction) |
管理员 |
p1_fix_kali_vm_memory.ps1 |
Hyper-V VM 内存修复(先 Stop-VM -Force 切 Off) |
管理员 |
全部脚本遵循同一原则:先校验、再操作、操作完再校验。
标签:#Windows #C盘优化 #Hyper-V #Junction迁移 #Pagefile #PowerShell