ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

C盘清理命令大全:用Windows自带工具安全释放磁盘空间

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 {NUsedGB;E{[math]::Round($_.Used/1GB,2)}}, {NFreeGB;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.old10GB 到 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, {NSizeMB;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 {NUsedGB;E{[math]::Round($_.Used/1GB,2)}}, {NFreeGB;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, {NSizeMB;E{[math]::Round($_.Length/1MB,2)}}如果发现某个软件的缓存持续增长可以从软件设置里调整缓存目录或者定期自动清理。如果最后确实需要更多空间再考虑调用磁盘管理工具调整分区。比如把 D 盘部分空间分给 C 盘这类操作需要先备份数据并且最好使用可靠的磁盘分区工具不要在系统运行繁忙时操作。扩容有风险建议放到清理完所有垃圾、确认系统状态正常之后再做。把上面这套流程执行完C 盘释放几 GB 是常见结果。但“一条命令清理 C 盘”不是终点。我更建议你把命令脚本固定下来然后每周或每两周看一眼空间变化。很多时候 C 盘满了不是某一次垃圾太多而是某个程序持续往系统盘写入。真正能解决问题的不是等它满了再清理而是找到写入来源把缓存迁移到其他盘或者给系统盘留出合理余量。我在实际处理中见过很多“清理后没几天又满了”的案例最后排查下来都是微信、浏览器或更新服务在持续写入。命令能帮你解决临时文件但解决不了持续写入。先跑单次清理再观察一周最后决定要不要定时执行这才是最稳的节奏。
返回列表