
我之前在项目里碰过一次特别尴尬的故障代码编译到一半磁盘直接写满构建日志里全是 red。拆开 C 盘一看系统临时目录、用户临时目录、npm cache、pip cache、Windows 更新缓存加起来硬生生躺了 30GB 文件。从那以后我就开始琢磨一套不用动手的临时文件自动化方案最后沉淀下来的核心就是一个 bat 批处理脚本加 Windows 任务计划程序。这套方案不挑机器Win10、Win11 都能跑适合平时用 Windows 搞开发、偶尔打打游戏的人也适合公司里那些不想天天帮同事“点清理”的运维同学。后来我又把游戏向的优化项顺手加了进去关闭空闲后台服务、切高性能电源计划、刷 DNS 缓存一条命令全搞定。下面这篇就是我长期在用的脚本和踩坑记录照着抄就能用。1. 临时文件体系拆解几十个G的垃圾是怎么攒出来的1.1 六大临时文件来源盘点很多人一上来就删C:\Windows\Temp删完却发现 C 盘没掉多少空间原因是他根本没搞清楚临时文件到底散落在哪。我先把几个最常出问题的地方列一遍你再对照着自己的电脑看心里就有数了。C:\Windows\Temp系统临时目录系统服务和部分驱动在运行、安装、更新时往里写文件。这个目录通常不需要管理员天天伺候但长期不清理里面会留下大量安装包解压残留和驱动日志几百 MB 到几个 GB 都有可能。C:\Users\你的用户名\AppData\Local\Temp用户临时目录这是垃圾的大本营。几乎所有用户态程序都往这里写安装包解压中途的碎片、办公软件缓存、浏览器临时文件、压缩包解压残留。我见过最夸张的一台机器这个目录里躺了 11GB 的文件。C:\Windows\Prefetch预读取目录系统为了加快常用程序启动会把程序启动时加载的模块路径记成.pf文件。这个目录本身不大但文件数量多到一定程度反而会拖慢开机扫描速度。C:\Windows\SoftwareDistribution\DownloadWindows 更新缓存系统更新下载的安装包都会暂存在这里。很多机器半年不清理这个目录能吃掉好几个 GB而且里面的文件一旦装完就基本没用了。开发工具缓存npm cache、pip cache、Gradle caches、Maven 仓库、JetBrains 系列 IDE 的 caches。这些才是开发者 C 盘爆红的真正元凶因为它们不显眼却动辄十几个 GB。应用软件缓存浏览器缓存、微信/企业微信的接收文件缓存、各类播放器的临时文件。这些通常由软件自己管理但偶尔也会失控。看清楚了吗所以“清理临时文件”不是简单删一个目录的事而是一个覆盖系统层、用户层、开发工具层的系统工程。1.2 不清理会出什么事我自己的教训是项目用到的镜像和依赖本来就多D 盘已经快满了结果 C 盘 Temp 目录里堆了大量编译中间文件。某次 CI 构建跑到一半磁盘写入直接失败整个构建任务挂掉日志里全是 red。你说这是代码问题吗不是就是临时文件把磁盘空间吃光了。除此之外临时文件堆积还会带来几个很烦的影响系统更新可能因为SoftwareDistribution目录里的陈旧文件而更新失败开机变慢Prefecth 文件太多会拖慢启动扫描%TEMP%里残留的旧文件会让某些安装程序在解压时因为路径冲突而报错。对于开发者来说最痛的一点是你根本不知道哪次构建失败其实只是“C 盘没地方写临时编译产物了”。1.3 手动清理为什么总是半途而废手动清理听着简单实际操作起来基本是灾难。第一%TEMP%里总有大量文件被正在运行的程序占用删到一半弹几十个“另一个程序正在使用此文件”的框耐心直接归零。第二权限问题系统 Temp 和 Prefetch 需要管理员权限普通用户双击进去看都看不了几个文件。第三没人敢保证自己手动删的东西百分之百安全万一误删了WinSxS里的组件或者Installer目录里的 msi系统哪天更新或卸载软件的时候就会给你颜色看。所以结论很清楚清理临时文件这件事必须自动化、可重复、带日志、不弹窗。这也是我最终选择 bat 批处理脚本的原因。2. 自动化方案选型为什么我最终锁定 bat 批处理2.1 主流方案横向对比方案优点缺点适合人群CCleaner / Dism 等图形工具界面友好扫描直观清理规则不透明免费版调度有限部分工具还带捆绑不折腾、偶尔手动点一下的普通用户PowerShell 脚本功能强能写复杂逻辑默认执行策略经常拦截语法门槛高需要额外配置愿意花时间学脚本的进阶用户bat 批处理原生支持双击就能跑配合任务计划程序零依赖字符串处理恶心逻辑复杂时容易失控想一劳永逸做自动化的开发者和运维网上流传的“万能优化脚本”一键执行看着很爽来源不明可能包含恶意命令也可能乱关服务导致系统异常不建议任何人有侥幸心理去用我自己的选择是 bat原因很实际任务计划程序调度它不需要任何额外组件schtasks直接就能注册周期任务而且 bat 做删除和遍历目录这种活天然简单直接代码量最少出问题也好排查。2.2 bat 方案的核心优势与边界bat 在清理场景里有三个硬优势。一是零依赖任何 Windows 系统都自带 cmd不像 PowerShell 还需要考虑执行策略也不像第三方工具需要安装。二是容错容易用nul 21把错误全部吃掉文件被占用就当没这回事根本不中断脚本。三是调度无缝任务计划程序可以直接执行.bat文件不需要额外写包装层。但它的边界也很明显bat 的日期处理依赖系统区域格式做复杂的日志轮转很别扭字符串切片容易踩坑没有真正意义上的“事务”概念。所以我的经验是bat 适合做“无脑删除记录日志”这种简单可靠的事一旦你要做复杂的判断和交互还是换 PowerShell 或写个小工具别硬撑。2.3 脚本设计的五条原则我在写这套脚本的时候给自己定了五条铁律你可以直接拿去用一切以管理员权限为前提脚本开头必须检查权限没权限就直接退出别让用户傻乎乎跑一遍然后看到一堆“拒绝访问”。先备份再动手只要涉及修改服务或注册表就先备份原状态出问题能还原。能静默就静默删除操作全部加nul 21清理就该静默完成而不是弹一堆人看不懂的错误框。留日志每次执行把起止时间和清理项写进日志文件以后排查“磁盘怎么又满了”的时候有迹可循。保守优先拿不准的目录宁可跳过也不强删黑名单比白名单更重要。3. 手写核心脚本临时文件清理模块逐行拆解3.1 最简可用版三条核心命令如果你只是想快速清理掉最占空间的临时文件不需要任何花活下面这段就够了。把它存成clean.bat右键以管理员身份运行即可。echo off :: 请以管理员身份运行 del /f /s /q /a %SystemRoot%\Temp\* nul 21 for /d %%i in (%SystemRoot%\Temp\*) do rd /s /q %%i nul 21 del /f /s /q /a %TEMP%\* nul 21 for /d %%i in (%TEMP%\*) do rd /s /q %%i nul 21 echo 清理完成 pause这段代码的核心逻辑就两句话del删除所有文件配合for /d加rd删除所有子目录。/a参数让隐藏属性和系统属性的文件也被处理nul 21把成功和错误输出全部静默掉。对于多数电脑来说光清这两个目录就能腾出好几个 GB。3.2 带日志和保护的正式版最简版适合临时救火长期自动化我还是建议用下面这个正式版。它多了日志、权限检查、Windows 更新缓存、Prefetch 和开发缓存清理这几块每次运行都有记录。echo off setlocal enabledelayedexpansion title Temp Cleanup Tool :: 1. 管理员权限检查 net session nul 21 if %errorlevel% neq 0 ( echo [!] 请右键以管理员身份运行本脚本。 pause exit /b 1 ) :: 2. 准备日志目录 set LOG_DIR%SystemDrive%\CleanupLogs if not exist %LOG_DIR% mkdir %LOG_DIR% set LOG_FILE%LOG_DIR%\cleanup.log echo %LOG_FILE% echo [%date% %time%] 清理开始 %LOG_FILE% :: 3. 清理 Windows 系统临时目录 del /f /s /q /a %SystemRoot%\Temp\* nul 21 for /d %%d in (%SystemRoot%\Temp\*) do rd /s /q %%d nul 21 :: 4. 清理当前用户临时目录 del /f /s /q /a %TEMP%\* nul 21 for /d %%d in (%TEMP%\*) do rd /s /q %%d nul 21 :: 5. 清理 Windows 更新下载缓存 del /f /s /q /a %SystemRoot%\SoftwareDistribution\Download\* nul 21 for /d %%d in (%SystemRoot%\SoftwareDistribution\Download\*) do rd /s /q %%d nul 21 :: 6. 清理 Prefetch不要频繁执行 del /f /s /q /a %SystemRoot%\Prefetch\* nul 21 :: 7. 开发工具缓存按需开启 :: npm if exist %LocalAppData%\npm-cache ( rd /s /q %LocalAppData%\npm-cache nul 21 ) :: pip if exist %LocalAppData%\pip\Cache ( rd /s /q %LocalAppData%\pip\Cache nul 21 ) echo [%date% %time%] 清理完成 %LOG_FILE% echo 清理完成日志位于%LOG_FILE% endlocal这里需要提醒一句npm cache 和 pip cache 的清理是“伤敌一千自损八百”的操作删掉之后下次npm install或pip install会全部重新下载。我脚本里默认只处理 Windows 相关目录开发缓存那两段是注释状态你确定要清的时候再去掉注释或者只在磁盘告急的时候手动跑一次。3.3 关键命令和机制说明为什么del之后还要接一个for /d循环因为del只删文件不删目录而 Temp 目录下还有很多安装程序留下的子目录这些子目录里的文件删掉后空壳目录还用得着用rd一层一层清。for /d是专门遍历目录的循环配合rd /s /q就能把子目录整个端掉。另一个关键设计是“删内容但绝不删目录本身”。我见过有人直接写rd /s /q %TEMP%这会带来两个问题一是当前会话可能有程序正握着这个目录的句柄删除会失败二是就算删成功了%TEMP%这个环境变量指向的路径暂时不存在了后续有程序要写临时文件就会报错。所以正确做法是清空目录内容保留目录本身永远不要删顶层。如果你担心“一刀切”会删掉还在使用的文件可以用forfiles做时间窗口过滤只删 N 天前的文件:: 只删除 Temp 目录下 7 天前的文件 forfiles /p %SystemRoot%\Temp /s /m *.* /d -7 /c cmd /c del /f /q /a path nul 21这个命令的/d -7表示只匹配最后修改日期在 7 天之前的文件安全性高很多特别适合你把它挂在任务计划里每天跑的场景。4. 把游戏优化也写进同一个脚本服务、电源、网络扩展有人可能觉得奇怪清理临时文件怎么和游戏性能扯上关系了其实很多人的真实诉求是既想把系统垃圾清掉又想让打游戏的时候帧数稳定一点。这个需求完全合理所以我后来把游戏向的优化也整理进了同一套 bat 里包含关闭后台服务、高性能电源计划、网络延迟优化和临时文件清理四件事。4.1 后台服务关哪些、怎么关、怎么恢复很多游戏卡顿其实不是 CPU 或显卡不够而是后台服务在关键时刻突然开始读写磁盘或抢占 CPU。下面这几个服务是我认为“关掉影响不大、开着纯属浪费”的SysMainSuperFetch作用是预加载常用程序到内存。在机械硬盘时代它确实有用但 SSD 时代它的收益基本为零有时候反而会持续占用磁盘。DiagTrackConnected User Experiences and Telemetry微软的遥测服务收集系统诊断数据。关掉几乎不影响任何正常功能。WSearchWindows Search文件搜索索引服务。如果你很少用系统搜索或者能接受搜索变慢一点可以关。但如果你经常按 Win 键搜文件别关。关闭服务的命令是sc config配合start disabled注意start后面必须有个空格这是sc命令的固定语法。完整代码我放在 4.4 节的整合脚本里。这里必须泼一盆冷水现代 Windows 对空闲服务的资源管控已经做得很好了关这几个服务能省下的内存可能不到 200MB不会让你的游戏帧数从 60 变成 120。真正的作用是减少后台进程偶发的磁盘 IO 和 CPU 波动让游戏帧生成时间更稳定。所以别指望“神优化”把它当成锦上添花就好。恢复服务也不难。我脚本里会把服务原来的启动类型备份到C:\service_backup_日期.txt你打开这个文件看到某一行写着START_TYPE : 2 AUTO_START就说明这个服务原来是自动启动。恢复时执行sc config DiagTrack start auto net start DiagTrack如果你希望万无一失跑任何服务优化脚本之前先在“系统属性 - 系统保护”里手动创建一个还原点。这是成本最低的后悔药。4.2 高性能电源计划电源计划对游戏帧数的影响很直接尤其是笔记本。Windows 默认的“平衡”计划会频繁调整 CPU 频率帧数就容易忽高忽低。切换成高性能计划很简单powercfg /setactive SCHEME_MINSCHEME_MIN是高性能计划的固定 ID不是某个随机字符串。执行完可以用powercfg /getactivescheme验证当前生效的计划。笔记本用户要注意高性能计划会让风扇转得更勤、电池掉得更快插电打游戏的时候用没问题日常办公我还是建议切回平衡。如果你想让电脑连“高性能”里的磁盘和 USB 暂停都关掉可以在电源选项的高级设置里把“在此时间后关闭硬盘”和“USB 选择性暂停设置”都设为“从不”。这一步 bat 脚本不太好做图形界面点几下更快。4.3 网络延迟优化别被注册表玄学带偏很多人一聊到网络优化就两眼放光总觉得改几个注册表值游戏延迟就能从 80ms 变成 20ms。真实情况没那么神奇但有两件事确实值得做。第一件事是刷新 DNS 缓存命令是ipconfig /flushdns当你的网络环境频繁变化或者某个域名解析结果已经过期残留的 DNS 缓存确实会导致连接变慢甚至连接失败。清一下就完事了安全无害。第二件事是恢复 TCP 自动调优默认值netsh int tcp set global autotuninglevelnormal这个命令适合那些之前被别人“优化”过、或者用过奇怪加速软件导致网络异常的机器。把它恢复成正常状态比任何玄学参数都靠谱。网上流传最多的两个注册表优化值TcpAckFrequency1和TCPNoDelay1简单说就是让 TCP 立即确认、不延迟发送理论上是能降低一点小包延迟。实际效果在现代网卡和游戏引擎面前非常有限因为多数游戏的核心对战数据走的是 UDP根本不经过 TCP 这一层。但既然大家想试我也把代码放在整合脚本里注意这是可选优化不是必须项更不是什么灵丹妙药。最后强调一个反面教材不要随便执行netsh winsock reset。这个命令虽然能重置网络协议栈但也会把你系统里所有依赖网络过滤功能的软件配置一并重置某些安全软件或抓包工具会失效。只在你确定网络栈被污染、其他方法都无效的时候才用它。4.4 整合完整脚本下面是完整的 bat 优化脚本包含服务优化、电源计划、网络优化、临时文件清理四部分。保存为optimize.bat右键以管理员身份运行。echo off setlocal enabledelayedexpansion title Windows Optimizer - Game Dev :: 权限检查 net session nul 21 if %errorlevel% neq 0 ( echo [!] 请右键以管理员身份运行本脚本。 pause exit /b 1 ) :: 备份服务原始启动类型 set BK_FILE%SystemDrive%\service_backup_%date:~0,4%%date:~5,2%%date:~8,2%.txt echo BackupFile%BK_FILE% sc qc DiagTrack 2nul | findstr /i START_TYPE %BK_FILE% echo. echo [1/4] 切换高性能电源计划... powercfg /setactive SCHEME_MIN if %errorlevel% equ 0 ( echo 已启用高性能电源计划。 ) else ( echo 切换失败请检查系统电源选项。 ) echo. echo [2/4] 关闭不必要的后台服务... call :DisableSvc DiagTrack Telemetry call :DisableSvc SysMain SuperFetch :: 按需取消下面这行的注释关闭 Windows 搜索索引 :: call :DisableSvc WSearch Windows Search echo. echo [3/4] 网络延迟优化... ipconfig /flushdns nul 21 netsh int tcp set global autotuninglevelnormal nul 21 for /f tokens* %%i in (reg query HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces 2^nul) do ( reg add %%i /v TcpAckFrequency /t REG_DWORD /d 1 /f nul 21 reg add %%i /v TCPNoDelay /t REG_DWORD /d 1 /f nul 21 ) echo DNS 缓存已刷新TCP 参数已调整。 echo. echo [4/4] 清理临时文件... call :CleanTemp echo. echo echo 优化完成建议重启电脑后生效。 echo 服务原状态备份文件 echo %BK_FILE% echo 如需恢复服务请执行 echo sc config 服务名 start auto echo 例如sc config DiagTrack start auto echo pause exit /b 0 :DisableSvc set svc%~1 sc query %svc% nul 21 if %errorlevel% neq 0 ( echo 跳过%svc% 不存在。 goto :eof ) sc qc %svc% | findstr /i START_TYPE %BK_FILE% sc config %svc% start disabled nul 21 net stop %svc% nul 21 echo 已禁用%svc% goto :eof :CleanTemp del /f /s /q /a %SystemRoot%\Temp\* nul 21 for /d %%d in (%SystemRoot%\Temp\*) do rd /s /q %%d nul 21 del /f /s /q /a %TEMP%\* nul 21 for /d %%d in (%TEMP%\*) do rd /s /q %%d nul 21 echo 临时文件清理完成。 goto :eof使用这个脚本之前先把 4.1 节的内容再读一遍确认你不需要那些服务。尤其是带反作弊的竞技游戏某些反作弊服务依赖系统网络和调试组件乱关服务导致游戏进不去可就因小失大了。5. 自动化部署定时任务让脚本自己跑脚本写完了最大的问题是你不可能每次都记得右键管理员运行。所以最后一步是把脚本交给 Windows 任务计划程序让它在每周固定时间自动执行。5.1 使用任务计划程序图形界面配置如果你习惯用鼠标操作按下面几步来Win R输入taskschd.msc打开任务计划程序。右侧点击“创建任务”不是“创建基本任务”因为“创建基本任务”的选项不够细。“常规”选项卡填个名称比如TempCleanup勾选“使用最高权限运行”。“触发器”选项卡点击“新建”选择“每周”设置一个你通常不在用电脑的时间。我建议周日凌晨 3 点这个时间段系统负载低也不容易撞上你在加班。“操作”选项卡点击“新建”操作选“启动程序”程序或脚本填你的 bat 文件完整路径。不管你脚本放在哪里路径里不要有空格有空格就需要用cmd /c那套引号转义容易出幺蛾子。“条件”选项卡如果你用的是笔记本建议去掉“只有在计算机使用交流电源时才启动此任务”前面的勾这样即使没插电源也能跑当然代价是费点电。“设置”选项卡勾选“如果错过计划的启动时间则尽快启动任务”这样即使当时电脑关机或休眠下次开机后也会补跑。5.2 使用 schtasks 命令行注册周期任务命令行方式更简洁适合写进部署脚本。比如每周日凌晨 3 点运行C:\Scripts\clean.bat以最高权限执行schtasks /create /tn TempCleanupTask /tr C:\Scripts\clean.bat /sc weekly /d SUN /st 03:00 /rl HIGHEST /f参数说明/sc weekly表示每周执行/d SUN指定周日/st 03:00指定启动时间/rl HIGHEST申请最高权限/f表示如果同名任务已存在就强制覆盖。想测试任务是否正常可以手动运行一次schtasks /run /tn TempCleanupTask不需要它了就用schtasks /delete /tn TempCleanupTask /f5.3 运行账户、权限与触发条件任务计划程序里最容易踩的坑是“运行账户”问题。如果任务用SYSTEM账户运行脚本里的%TEMP%会指向C:\Windows\Temp而不是你平时登录账号的AppData\Local\Temp那些用户态开发缓存npm cache、pip cache根本清理不到。我的建议是清理系统级临时文件的任务可以用SYSTEM账户跑但如果你想顺手清开发缓存就必须以你自己登录的账户创建任务并且勾选“使用最高权限运行”。也就是说不加/ru SYSTEM默认就是以当前用户身份运行。这样做会有一个副作用如果你设置的时间点账户没有登录任务不会触发。对个人开发机来说这通常不是问题反正你不开机它也不该清。如果你既要 SYSTEM 级清理又要用户级清理那就建两个任务一个用SYSTEM跑系统清理脚本一个用你自己的账户跑用户清理脚本。别嫌麻烦这是最不容易出错的做法。5.4 如何验证任务真的有效任务计划程序不会替你检查清理效果所以验证这件事得自己做。我的习惯是注册完任务后立刻手动运行一次然后再看日志文件确认过程没有异常。日志位置在脚本里写死了是C:\CleanupLogs\cleanup.log打开看一眼如果里面有对应的起止时间记录就说明脚本正常执行了。如果要看磁盘空间的变化最简单的方法还是右键 C 盘看属性。如果你想用命令PowerShell 一行搞定Get-PSDrive C | Select-Object Used,Free我建议把“查看日志”和“查看磁盘空间”这两件事也做成每月例行检查而不是跑完就忘。毕竟临时文件清理这件事本质上是和熵增做对抗不进则退。6. 避坑指南与常见问题排查6.1 常见问题速查表这几类问题是我在实际使用中遇到最多的整理成表格放在这里遇到问题直接查。现象原因处理方法提示“拒绝访问”没有以管理员身份运行右键脚本选择“以管理员身份运行”删除过程中弹“另一个程序正在使用此文件”文件被占用正常现象忽略即可或改用forfiles只清理 N 天前的文件清理完 C 盘空间几乎没变化垃圾不在脚本覆盖的路径里用 WizTree 或 SpaceSniffer 扫描大文件定位真正的元凶bat 里的中文显示乱码编码问题把脚本保存为 ANSI 编码或把所有中文提示改成英文任务计划运行失败脚本路径带空格把脚本放到无空格的目录如C:\Scripts\clean.bat杀毒软件拦截脚本批量删除行为被误判把脚本目录加入杀毒软件白名单任务到点没跑用户没登录或电源条件限制勾选“错过计划后尽快运行”去掉交流电源限制6.2 绝对不能碰的黑名单文件清理临时文件的底线是知道哪些东西绝对不能删。下面这几个哪怕名字看起来像垃圾也不要手动强制删除。路径/文件为什么不能碰正确做法pagefile.sys、hiberfil.sys、swapfile.sys虚拟内存和休眠文件删了可能导致系统崩溃通过“系统属性 - 高级 - 性能 - 虚拟内存”管理C:\Windows\WinSxS组件存储目录手动删会破坏系统更新和服务包使用DISM /Online /Cleanup-Image /StartComponentCleanupC:\Windows\Installermsi/msp 安装补丁源删了会导致程序无法卸载或修复永远不要动System Volume Information系统还原点和卷影副本用磁盘清理工具里的“清理系统文件”功能C:\ProgramData\Package Cache安装器缓存删了会导致部分程序无法修复即使占空间也建议保留6.3 我踩过的坑和最终建议最后说几个只有实际操作过才会知道的细节。第一个坑是任务计划频率别设太激进。我之前做过一个“每 10 分钟清一次 Temp”的任务结果有次正在编译大型项目脚本把编译器刚写入的临时产物删掉了构建直接失败。从那以后我把所有高频任务改成每天或每周执行并且用forfiles加时间窗过滤只删 3 天前的文件安全和效率就平衡了。第二个坑是服务优化要看硬件。我给一台老机械硬盘的笔记本关掉 SysMain 之后开机和常用软件启动反而变慢了因为机械盘本来就靠预读取加速。后来我把服务恢复回自动才把性能找回来。所以别看了几篇“神优化”帖子就无脑抄作业动手之前先搞清楚自己的硬件是什么水平。第三个坑是脚本编码。bat 文件如果包含中文注释粘贴复制的时候经常遇到 ANSI 和 UTF-8 的编码冲突跑起来全是乱码甚至报错。我的做法是正式部署的脚本里面全部用英文提示中文说明只写在博客文章里这样任何电脑上打开都不会出问题。说实话这套自动化方案写下来真正让我省心的地方不在于“能清出多少 GB”而在于它把一件琐碎、容易忘、又必须重复做的事变成了后台系统的一部分。你只需要每个月瞄一眼日志偶尔看看磁盘剩余空间剩下的交给脚本自己处理。如果你也想搭一套从第 3 节的正式版脚本开始跑通之后再考虑加第 4 节的游戏优化和第 5 节的定时任务一步一步来别一口吃成胖子。