VSCode无内置自动缓存清理机制,因Cache、GPUCache、WorkspaceStorage等设计为长期驻留且不主动淘汰旧数据,需手动配置脚本、计划任务或插件实现定时清理,否则易致C盘爆红、卡顿、插件失效。

VSCode 没有内置的自动缓存清理机制,所谓“自动”必须靠你手动配置触发点或借助外部工具调度——不设防就等着 C 盘某天突然爆红、右键卡顿、插件灰显。
为什么不能依赖 VSCode 自动清理?
VSCode 的 Cache、GPUCache、WorkspaceStorage 等目录设计为“长期驻留+按需重建”,它不会主动判断“这个缓存 90 天没用了,该删”。语言服务器(如 ms-python.python)的 -cache 子目录更是只增不减,更新中断后直接残留损坏包。终端历史、CachedData、logs 同理——全靠你干预。
- 官方从未提供定时清理开关或后台守护进程
- 所有“自动”效果都来自你配置的保存钩子、任务脚本、系统计划任务或第三方插件
- 误配可能触发高频删除,导致每次启动都重建缓存,反而拖慢体验
用 Run On Save 插件实现保存时清 Python 缓存
适合 Python 用户快速解决 .pyc 和 __pycache__ 积累问题,不依赖系统级调度,响应及时。
- 安装插件:
emeraldwalk.RunOnSave - 在工作区根目录的
.vscode/settings.json中添加:
{
"emeraldwalk.runOnSave": {
"commands": [
{
"match": "\.py$",
"cmd": "find ${fileDirname} -name "*.pyc" -delete && find ${fileDirname} -name "__pycache__" -type d -exec rm -rf {} +"
}
]
}
}- 仅对
.py文件保存生效;${fileDirname}保证只清当前项目,不波及全局 - 注意:Windows PowerShell 下需改用
Get-ChildItem替代find,否则命令失败 - 它不清
ms-python.python-*.cache目录——那部分得单独处理
用系统计划任务定时清核心缓存目录
真正意义上的“自动清理”,但必须严格限定路径和频率,避免误伤或资源争抢。
- Windows(PowerShell + 任务计划程序):
# 保存为 clean-vscode-cache.ps1
Remove-Item "$env:APPDATACodeCache*" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item "$env:APPDATACodeGPUCache*" -Recurse -Force -ErrorAction SilentlyContinue
# 只删 90 天前的 WorkspaceStorage 子目录(关键!)
Get-ChildItem "$env:APPDATACodeWorkspaceStorage" -Directory |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-90) } |
Remove-Item -Recurse -Force- 在任务计划程序中设置每周日凌晨 2 点运行,且勾选“只在用户登录时运行”+“即使未登录也运行”
- macOS/Linux 用户请用
launchd或cron调度rm -rf命令,路径对应替换:~/Library/Caches/com.microsoft.VSCode、~/.config/Code/WorkspaceStorage - 务必确保 VSCode 已退出——脚本开头可加
Stop-Process -Name Code -ErrorAction SilentlyContinue(Windows)
Workspace Storage Cleanup 插件能替代手动定时吗?
它能识别并列出每个 WorkspaceStorage 子目录对应的实际项目路径,支持勾选删除,但不是后台自动运行的守护进程。
- 首次使用需手动打开命令面板(
Ctrl+Shift+P),输入Workspace Storage: Cleanup - 它不支持设定“每 7 天自动删旧目录”,也不能集成进 CI 或多用户环境
- 优势在于安全:显示项目路径而非 GUID 名,避免误删正在活跃的工作区
- 适合偶尔手动审计,不适合“设好就忘”的自动化场景
真正容易被忽略的是:所有自动方案都绕不开进程锁。哪怕计划任务设好了,如果 Code.exe 或 node.exe 还在后台挂着,Remove-Item 或 rm 就会静默失败,磁盘空间一丁点都不会释放——这点必须写死在脚本里,不能靠人肉检查。


















