C盘清理命令大全:用Windows自带工具安全释放磁盘空间
C盘红了,很多人第一反应是下载清理软件。实际最稳妥的方法是直接使用 Windows 自带的命令行工具。命令清理C盘的核心价值不是“快”,而是可控制、可复现,所有操作都能看到系统在做什么。这篇文章不推荐你放弃图形界面,也不会让你去删 System32,而是把磁盘清理、更新缓存、临时文件和回收站这些安全项串起来,整理成一条命令行脚本。整个过程不需要第三方软件,适合系统能正常进入、C盘还有少量剩余空间的普通用户。先交代一下运行环境:Windows 10 或 Windows 11,使用管理员权限打开命令行或 PowerShell,磁盘格式建议是 NTFS。下面的命令在多数这样的环境下都能跑。
1. 先弄明白:C盘空间到底被什么吃掉了
清理之前最重要的一步,不是急着输命令,而是先搞清楚 C 盘空间被哪个方向占用了。原因很简单:不同占用类型对应不同的清理命令。如果你用清理临时文件的命令去处理更新缓存,效果会非常有限。
1.1 先看空间占用,再决定删什么
先查一下当前 C 盘的剩余空间。在 PowerShell 里运行:
Get-PSDrive C | Select-Object Used,Free输出里能看到已用空间和剩余空间,单位是字节。如果想看更直观的 GB 数,可以这样:
Get-PSDrive C | Select-Object @{N='UsedGB';E={[math]::Round($_.Used/1GB,2)}}, @{N='FreeGB';E={[math]::Round($_.Free/1GB,2)}}如果 C 盘剩余空间已经低到个位数 GB,优先处理更新缓存、休眠文件和临时文件。这三个方向通常见效最快。我不建议一上来就全盘扫描所有目录,因为 Windows 系统目录里的文件数量非常多,全盘扫描在机械硬盘上可能要跑十几分钟,在资源已经很紧张的情况下反而容易卡住。
1.2 常见占用大户和可清理项目判断
根据我自己处理过的机器,C盘空间占用通常集中在下面这些地方:
| 目录或文件 | 常见大小 | 是否可以清理 |
|---|---|---|
| C:\Windows\SoftwareDistribution\Download | 几百MB到几十GB不等 | 可以清,Windows更新下载缓存 |
| C:\Windows\Temp | 几十MB到几GB | 可以清,系统临时文件 |
| 用户目录下的 AppData\Local\Temp | 几百MB到几十GB | 可以清,用户临时文件 |
| C:\Windows.old | 10GB 到 30GB 以上 | 可以清,旧系统文件,需要磁盘清理工具 |
| hiberfil.sys | 与内存大小相关 | 可以关闭休眠释放,但会影响快速启动 |
| pagefile.sys | 与内存大小相关 | 不建议直接删除 |
| System Volume Information | 还原点大小 | 谨慎处理,不建议手动删除 |
| C:\Windows\WinSxS | 几GB到十几GB | 不要直接删,只能用 Dism 清理组件存储 |
这里面最容易被误删的是 WinSxS 文件夹。它的体积看着很大,但里面很多是系统组件硬链接,直接删除会导致系统损坏。正确做法是使用后面的 Dism 命令清理,而不是进入目录手动删。
1.3 千万别碰的目录
有些目录无论空间多紧张,都不要直接删除或移动。如果你看到网上有人说“删除 C:\Windows\System32 释放空间”,那一定不要照做。System32、System32\drivers、Program Files、ProgramData 这些目录是系统和软件运行的基础。用户文档、桌面、下载文件夹也不应该放在自动清理脚本里,这些是个人数据。
另外,很多程序员会把开发环境临时缓存放在 AppData\Local 下,比如 npm 缓存、pip 缓存、Docker 镜像数据。清理的时候要注意区分:如果只是为了释放空间,先清理临时文件,不要一上来就把缓存目录删光,否则下次运行开发工具会重新下载,反而更慢。
我的建议是:第一次清理时,尽量不要使用“一键删除所有文件”的通配符命令,先按目录查看大小,再决定怎么处理。
2. 使用系统自带命令做安全清理
理解了空间占用方向之后,下面进入命令层面。这部分我会拆成三个命令:cleanmgr、Dism、PowerShell。它们分别处理普通垃圾、系统组件缓存和临时文件/回收站。
2.1 cleanmgr 磁盘清理:最稳妥的起点
cleanmgr 是 Windows 自带的磁盘清理工具。它的优势是能识别系统自身的可清理项,比如 Windows 更新清理、临时文件、缩略图、错误报告等。直接运行:
cleanmgr会弹出图形界面,勾选项目后点确定。但这不是推荐用法,因为每次都要手动勾选,无法自动化。
更好的做法是先保存一份清理配置。执行:
cleanmgr /sageset:1这时会弹出磁盘清理配置窗口,里面列出了当前系统可清理的项目。建议勾选这些安全项:
- Windows 更新清理
- 临时文件
- 回收站
- 缩略图
- 错误报告和解决方案
- 传递优化文件
- DirectX 着色器缓存
不要在配置里勾选“下载”或“我的文档”,这里一旦勾选,脚本执行时可能会删除个人文件。
配置保存后,以后执行:
cleanmgr /sagerun:1就会按照刚才保存的配置自动清理。这就是“一条命令”落地的基础。如果你直接运行 sagerun,但没有提前运行过 sageset,清理项可能不完整,所以第一次一定要先配置。
2.2 Dism 清理系统更新缓存
更新系统后,C:\Windows\SoftwareDistribution 目录里会留下旧的更新安装包。普通删除命令很难彻底清理,因为很多文件被系统服务占用。这时需要用到 Dism 的工具:
Dism.exe /Online /Cleanup-Image /StartComponentCleanup这个命令会清理组件存储 WinSxS 里的被替换系统组件,并压缩组件存储。它不会删除用户的个人文件,也不会影响当前系统组件。执行时间取决于系统更新历史,通常几分钟到十几分钟。
如果你还想进一步清理旧组件,可以考虑加参数:
Dism.exe /Online /Cleanup-Image /StartComponentCleanup /ResetBase但这里要提醒:加了 ResetBase 之后,已经安装的更新无法单独卸载,因为基础组件被重置了。日常清理没必要使用,除非空间非常紧张,而且你能接受“以后不能卸载旧更新”这个限制。
2.3 PowerShell 清理临时文件和回收站
临时文件可以用 PowerShell 更精细地处理。下面的命令会清理用户临时目录和系统临时目录里修改时间超过 7 天的文件:
$cutoff = (Get-Date).AddDays(-7) $tempPaths = @("$env:TEMP", "C:\Windows\Temp", "C:\Users\*\AppData\Local\Temp") Get-ChildItem -Path $tempPaths -Recurse -Force -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -lt $cutoff } | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue这段代码的关键点:
$tempPaths指定要清理的目录,包含当前用户临时目录、系统临时目录、所有用户下的 Local\Temp。-ErrorAction SilentlyContinue表示遇到正在使用的文件时跳过,不影响后续清理。- 只清理 7 天前的文件,是为了避免删除正在运行中的程序需要的临时文件。
回收站清理可以直接用:
Clear-RecycleBin -DriveLetter C -Force -ErrorAction SilentlyContinue如果你只想清空 C 盘回收站,这个命令就够了。如果想清理所有盘符的回收站,可以去掉-DriveLetter参数。
3. 把命令组合成一条批处理脚本
单独执行上面的命令,已经能释放不少空间。但每次都手动敲三四条命令比较麻烦。更好的方式是写成批处理脚本,以管理员身份运行一次,就完成全部清理。
3.1 一个可直接运行的清理脚本
打开记事本,保存为clean-c.bat,注意编码建议选择 ANSI 或 UTF-8 with BOM。内容如下:
@echo off echo [1/4] Running Disk Cleanup... cleanmgr /sagerun:1 echo [2/4] Cleaning component store... Dism.exe /Online /Cleanup-Image /StartComponentCleanup echo [3/4] Cleaning temp files... powershell -NoProfile -ExecutionPolicy Bypass -Command "$cutoff=(Get-Date).AddDays(-7); $tempPaths=@('C:\Users\*\AppData\Local\Temp', $env:TEMP, 'C:\Windows\Temp'); Get-ChildItem -Path $tempPaths -Recurse -Force -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -lt $cutoff } | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue" echo [4/4] Cleaning recycle bin... powershell -NoProfile -ExecutionPolicy Bypass -Command "Clear-RecycleBin -DriveLetter C -Force -ErrorAction SilentlyContinue" echo Finish. pause保存后,右键选择“以管理员身份运行”。执行前请确认已经运行过一次cleanmgr /sageset:1并勾选了安全清理项,否则第一步可能只清理默认项目。
3.2 为什么这样安排执行顺序
脚本里的执行顺序不是随便排的。
先跑 cleanmgr,是因为它最安全,清理的是系统认定的临时垃圾,执行速度快。再跑 Dism,是因为 Dism 会扫描组件存储,如果前面已经清理过普通临时文件,它的扫描范围更小,时间更短。临时文件清理放在 Dism 后面,是因为 Dism 运行过程中可能产生新的临时文件,最后再清一次能把尾部垃圾带走。回收站放在最后,是因为前面几条命令如果产生新的删除项,也会进入回收站,最后统一清空更彻底。
不要同时打开多个清理工具。比如一边跑 Dism,一边跑第三方垃圾清理软件,容易造成文件锁冲突,结果就是某些项目清理不完整,还可能产生系统报错。
3.3 设置定时任务自动执行
脚本经常手动运行容易忘。如果电脑长期开机,可以设置每周自动清理一次。使用计划任务创建一条命令:
schtasks /Create /TN "C盘自动清理" /TR "C:\Tools\clean-c.bat" /SC WEEKLY /D SUNDAY /ST 03:00 /RL HIGHEST /RU SYSTEM /F参数解释:
/TN是任务名称,可以自定义。/TR是脚本路径,这里需要改成你实际存放脚本的位置,不要放在 C:\Windows 下,建议放在 C:\Tools 或 D 盘。/SC WEEKLY /D SUNDAY /ST 03:00表示每周日凌晨 3 点执行。/RL HIGHEST表示以最高权限运行。/RU SYSTEM表示使用系统账户,即使没有用户登录也会执行。
创建后可以在任务计划程序里查看和修改。我一般不建议把清理频率设置为每天一次,尤其是 Dism 命令,频繁执行会增加系统组件存储的读写压力,每周一次足够。
注意:自动任务适合长期运行但确实被持续写入的机器。如果你只是偶尔感觉 C 盘空间变少,手动跑一次脚本就够了,没必要一上来就部署定时任务。
4. 进阶参数、执行边界和常见坑点
前面是基本流程。下面这部分讲一些更偏实战的情况,包括休眠文件、大文件查找,以及哪些命令不要在生产环境随手执行。
4.1 休眠文件、还原点和虚拟内存怎么处理
休眠文件 hiberfil.sys 通常会占用物理内存的 40% 到 100% 空间。如果你的电脑内存是 16GB,这个文件可能达到 6GB 到 16GB。如果你完全不用休眠功能,可以在管理员命令行里关闭:
powercfg /h off这个命令会删除 hiberfil.sys。但它有个副作用:系统的“快速启动”也依赖休眠文件,关闭后开机速度可能会略微下降。如果你很在意开机速度,可以先保留休眠,优先清理其他项目。如果你愿意牺牲一点开机速度换取十几 GB 空间,那关闭休眠是性价比很高的选择。
系统还原点也是空间大户。不建议直接用vssadmin delete shadows命令去删,因为一旦操作范围没控制好,可能把所有还原点都删掉。更稳妥的是用磁盘清理的“系统还原和卷影复制”选项,或者留一个最近的还原点,再删除更早的。这部分操作我通常放在其他清理完成之后,因为如果系统在清理过程中出现问题,至少还能有个还原点可以恢复。
虚拟内存 pagefile.sys 不建议直接删除。虽然它是几十 GB 的大文件,但删除或强制关掉会导致系统在内存不足时无法使用页面文件。除非你清楚自己的内存压力很低,并且知道如何在系统设置中重新配置页面文件,否则不要动它。
4.2 查找大文件和大目录的常用命令
有时候你并不知道具体是哪个目录占用了空间,这时可以用 PowerShell 查找某个目录下最大的文件。下面的命令以C:\Users\用户名\AppData\Local为例,列出体积前 20 的文件:
Get-ChildItem -Path "C:\Users\你的用户名\AppData\Local" -Recurse -Force -File -ErrorAction SilentlyContinue | Sort-Object Length -Descending | Select-Object -First 20 FullName, @{N='SizeMB';E={[math]::Round($_.Length/1MB,2)}}注意替换“你的用户名”为实际路径。这个命令在目录文件很多时也会比较慢,所以我通常先查顶层目录,比如:
Get-ChildItem -Path "C:\Users\你的用户名\AppData\Local" -Directory -Force -ErrorAction SilentlyContinue | ForEach-Object { $size = (Get-ChildItem -Path $_.FullName -Recurse -Force -File -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum [PSCustomObject]@{ Folder = $_.FullName; SizeGB = [math]::Round($size / 1GB, 2) } } | Sort-Object SizeGB -Descending | Select-Object -First 10如果命令行操作不熟练,也可以借助第三方磁盘占用工具来辅助定位。工具只负责“看到哪里大”,最终删除和清理还是用系统命令,这样更安全。
4.3 不建议在生产环境随手执行的清理命令
有几类命令我建议不要在你的主力电脑上贸然执行。
第一类是直接删除 WinSxS 的命令。rd /s /q C:\Windows\WinSxS这类命令不要碰,无论它在网上被描述得多么省空间。WinSxS 里的组件很多是硬链接,直接删会导致系统文件损坏,蓝屏概率很高。
第二类是通配符全盘删除。del /f /s /q C:\Windows\*、rd /s /q C:\Windows\Temp\*这类命令如果不加过滤条件,会把正在使用的临时文件或系统缓存一并删掉。删完可能当时没事,但下次系统运行到某个功能时会突然报错。
第三类是清理系统日志文件。有些教程会让你删除C:\Windows\Logs或C:\Windows\Panther,这些目录在某些排错场景下确实有用,直接删掉会导致你以后遇到问题时无法定位原因。哪怕文件很大,也不要直接手动删,留给日志清理策略处理。
判断一条命令能不能执行,最简单的标准是:你是否知道它具体在删哪些文件,以及删完对系统有什么影响。如果答案含糊,那就不执行。
5. 清理完成后的验证与故障排查
命令跑完了,不代表清理成功。还需要验证空间是否真的释放,以及系统运行是否正常。
5.1 清理前后要对比哪些指标
清理前记录一下 C 盘空间:
Get-PSDrive C | Select-Object @{N='UsedGB';E={[math]::Round($_.Used/1GB,2)}}, @{N='FreeGB';E={[math]::Round($_.Free/1GB,2)}}清理后运行同样的命令,看 FreeGB 是否增加。通常第一次清理能释放几 GB 到几十 GB,具体取决于系统多久没清理、更新缓存有多大、休眠文件是否关闭。
另外要留意系统是否正常。重启一次电脑,确认能正常进入桌面,常用软件能打开。可以打开事件查看器里的“系统”日志,看有没有大量红色错误。一般来说,只要是执行上面的安全命令,不太会出现问题。如果清理完发现某个软件异常,先检查它的缓存目录是否被误删,再考虑恢复或重装。
5.2 清理命令没反应或报错时怎么排查
先看现象,再查原因。
如果cleanmgr /sagerun:1没反应,可能是没有以管理员身份运行。右键命令行或 PowerShell,选择“以管理员身份运行”。如果之前没有执行过cleanmgr /sageset:1,也会导致 sagerun 没有可用的配置,所以先确认配置这一步已经完成。
如果 Dism 报错,常见错误码是 0x800f081f 或 0x800f0906。这类报错通常表示系统组件存储有问题。先运行:
Dism.exe /Online /Cleanup-Image /ScanHealth扫描一下系统映像是否健康,再重新执行 StartComponentCleanup。如果仍然失败,不要强行继续,可以先运行sfc /scannow修复系统文件后再试。
如果临时文件清理过程中提示“文件正在占用”,这是正常现象,脚本里的-ErrorAction SilentlyContinue会跳过它。你不需要去结束占用进程,更不要强制删除,否则可能影响正在运行的程序。
如果批处理窗口闪退,最可能的是脚本路径错误或编码问题。建议先打开一个管理员命令行窗口,在窗口里手动运行脚本路径,例如:
C:\Tools\clean-c.bat这样即使报错,窗口也会停在屏幕上,方便定位问题。
5.3 清理后空间又满了怎么办
清理完过几天空间又降下去,说明系统里有一个持续写入的程序。不要继续盲目清理,先找到写入来源。
常见的原因是 Windows 更新下载失败后反复下载,目录位于 C:\Windows\SoftwareDistribution\Download。你可以重置 Windows Update 客户端,方法比较复杂,更简单的做法是先停止更新服务,清理目录,再启动服务:
net stop wuauserv net stop bits rd /s /q "C:\Windows\SoftwareDistribution\Download" net start wuauserv net start bits注意:这只清理下载缓存,不会影响已经安装的更新。
另一个常见原因是开发工具的缓存目录,例如浏览器缓存、视频会议缓存、聊天软件的文件目录。排查时可以用 PowerShell 按修改时间找最近几天写入的大文件:
Get-ChildItem -Path "C:\Users\你的用户名\AppData\Local" -Recurse -Force -File -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-3) } | Sort-Object Length -Descending | Select-Object -First 20 FullName, @{N='SizeMB';E={[math]::Round($_.Length/1MB,2)}}如果发现某个软件的缓存持续增长,可以从软件设置里调整缓存目录,或者定期自动清理。
如果最后确实需要更多空间,再考虑调用磁盘管理工具调整分区。比如把 D 盘部分空间分给 C 盘,这类操作需要先备份数据,并且最好使用可靠的磁盘分区工具,不要在系统运行繁忙时操作。扩容有风险,建议放到清理完所有垃圾、确认系统状态正常之后再做。
把上面这套流程执行完,C 盘释放几 GB 是常见结果。但“一条命令清理 C 盘”不是终点。我更建议你把命令脚本固定下来,然后每周或每两周看一眼空间变化。很多时候 C 盘满了不是某一次垃圾太多,而是某个程序持续往系统盘写入。真正能解决问题的,不是等它满了再清理,而是找到写入来源,把缓存迁移到其他盘,或者给系统盘留出合理余量。我在实际处理中见过很多“清理后没几天又满了”的案例,最后排查下来都是微信、浏览器或更新服务在持续写入。命令能帮你解决临时文件,但解决不了持续写入。先跑单次清理,再观察一周,最后决定要不要定时执行,这才是最稳的节奏。
