磁盘空间被占满这件事,基本是每个用过 Windows 的人都会撞上的坎。打开资源管理器看到 C 盘变红,不知道从哪里下手;用系统自带的磁盘清理扫了半天,删掉的东西却不多,反而把时间耗进去了。这次我们来看一种更直接的清理方式:用一条命令、一个脚本或一个开源小工具,把磁盘清理这件事变成真正的一键操作,而不是层层点菜单。
这篇文章不只讲“用哪款工具”,还会把 Windows 自带能力、命令行清理脚本、第三方开源工具三种方案都过一遍。你会知道哪些目录最占地方、哪些缓存可以放心删、清理之后怎么确认效果、遇到删不掉的文件怎么处理。如果你平时要给同事、客户或家里的电脑做维护,这篇文章可以直接收藏。
1. 核心能力速览
先给一张表,把三种主流方案的规格和适用范围看清楚。
| 方案类型 | 代表工具 | 适用系统 | 启动方式 | 是否需要安装 | 主要清理对象 | 是否支持命令行 | 适合场景 |
|---|---|---|---|---|---|---|---|
| Windows 自带 | 磁盘清理 cleanmgr | Windows 10 / 11 | 图形界面 / 命令行 | 不需要 | 系统缓存、临时文件、更新残留 | 支持,可配置自动清理 | 快速日常清理 |
| Windows 自带 | 存储感知 Storage Sense | Windows 10 / 11 | 设置界面 / 注册表配置 | 不需要 | 临时文件、回收站、下载文件夹 | 可通过注册表策略配置 | 定时自动清理 |
| 命令行脚本 | PowerShell 清理脚本 | Windows 10 / 11 | PowerShell 执行 | 不需要 | 临时目录、Windows 更新缓存、缩略图缓存 | 本就是命令行 | 批量维护、IT 运维 |
| 开源图形工具 | BleachBit | Windows / Linux | 图形界面 / 命令行 | 需要安装或便携版 | 浏览器缓存、日志、临时文件、应用缓存 | 支持,带白名单和排除项 | 不想写脚本的用户 |
| 磁盘占用分析 | WizTree / TreeSize | Windows | 图形界面 | 需要安装或用便携版 | 不直接清理,负责分析 | WizTree 无完整 CLI | 先找出大头再清理 |
从这张表可以看出,大部分场景其实不需要额外付费软件。系统自带工具加一个 PowerShell 脚本,已经能覆盖 90% 的临时文件和缓存清理。真正需要第三方工具的,主要是两步:第一,找到“到底是什么文件占了大头”;第二,处理那些零散在各应用目录下的缓存文件。
2. 适用场景与使用边界
任何磁盘清理工具,本质上都在做同一件事:删除不再需要的文件。删除文件是不可逆操作,所以使用边界必须先说清楚。
2.1 适合清理的内容
- 用户临时目录下的文件,路径通常是
C:\Users\用户名\AppData\Local\Temp。 - 系统临时目录,路径是
C:\Windows\Temp。 - Windows 更新下载缓存,路径是
C:\Windows\SoftwareDistribution\Download。 - 回收站内的旧文件。
- 浏览器缓存文件。
- Windows 缩略图缓存和图标缓存。
- 旧版 Windows 升级残留,如
C:\Windows.old。 - 各类应用程序运行过程中产生的日志和缓存目录。
2.2 不建议直接删除的内容
C:\Users\用户名\Documents、Desktop、Pictures等个人数据目录。C:\Program Files和C:\Program Files (x86)下已安装软件的安装目录,除非通过软件自带卸载流程。C:\Windows\System32等系统关键目录下的文件。- 各种开发项目目录下的
node_modules,这类目录虽然大,但删除后需要重新安装依赖,不属于“缓存垃圾”。 - 虚拟机磁盘文件、Docker 镜像文件,这类文件通常有独立管理方式,不建议直接删文件。
2.3 合规与安全边界
- 办公电脑清理前,先确认是否有公司策略限制。
- 涉及多用户共用电脑时,不要清理其他人正在使用的用户目录。
- 删除前建议先统计目录大小,确认没有正在被占用。
- 第三方工具只从官网或 GitHub 官方仓库下载,不要从下载站拿整合包。
3. 环境准备与前置条件
清理脚本和本文测试流程都不需要高配置电脑,但对运行环境有基本要求。
| 环境项 | 要求 |
|---|---|
| 操作系统 | Windows 10 1809 及以上,或 Windows 11 |
| 权限 | 管理员权限,部分系统目录清理必须提权 |
| PowerShell | 5.1 或 7.x 均可 |
| 执行策略 | 允许运行本机脚本,可能需要调整 ExecutionPolicy |
| 磁盘空间 | 不需要额外安装,但清理目标盘至少要保留 1GB 可用空间 |
| 显卡 | 无特殊要求 |
建议先创建系统还原点,或者至少确认关键数据已备份。清理脚本不会动个人文件,但稳健操作总是必要的。
4. 安装部署与启动方式
4.1 方案一:Windows 自带磁盘清理命令
Windows 自带工具不用安装,直接用命令就能启动。
# 打开图形界面的磁盘清理 cleanmgr # 指定清理 C 盘 cleanmgr /d C:要注意的是,cleanmgr /d C:打开的是图形界面,不会直接开始清理。真正要做无人值守清理,需要两步:先配置清理选项,再执行清理。
# 第一步:把当前清理配置保存为 sagerun:1 cleanmgr /sageset:1 # 第二步:静默执行刚才保存的配置 cleanmgr /sagerun:1/sageset:1会弹出磁盘清理设置窗口,勾选需要清理的项目,点击确定后配置会被保存到注册表。之后每次执行/sagerun:1都会按照刚才的配置自动清理,不会弹出任何窗口。这个机制很适合把磁盘清理加入到计划任务。
4.2 方案二:PowerShell 一键清理脚本
我建议把清理逻辑写成一个 PowerShell 脚本,命名如Invoke-DiskCleanup.ps1。脚本的核心思路是:逐个定位安全可清理的目录,统计清理前大小,执行删除,统计释放空间,最后输出报告。
下面给出一个基础版的完整脚本框架:
# Invoke-DiskCleanup.ps1 # 需要以管理员身份运行 $ErrorActionPreference = 'SilentlyContinue' # 定义清理目标 $targets = @( @{ Name = '用户临时目录'; Path = "$env:TEMP" }, @{ Name = '系统临时目录'; Path = 'C:\Windows\Temp' }, @{ Name = 'Windows 更新缓存'; Path = 'C:\Windows\SoftwareDistribution\Download' }, @{ Name = 'DirectX 着色器缓存'; Path = "$env:LOCALAPPDATA\D3DSCache" }, @{ Name = '缩略图缓存'; Path = "$env:LOCALAPPDATA\Microsoft\Windows\Explorer" } ) # 统计总释放空间 $totalFreed = 0 Write-Host "==== 磁盘清理开始: $(Get-Date) ====" -ForegroundColor Cyan foreach ($item in $targets) { $path = $item.Path if (-not (Test-Path $path)) { Write-Host "[跳过] $($item.Name) 目录不存在: $path" -ForegroundColor Yellow continue } # 统计清理前大小 $sizeBefore = (Get-ChildItem -Path $path -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum if ($sizeBefore -gt 0) { $sizeBeforeMB = [math]::Round($sizeBefore / 1MB, 2) Write-Host "[执行] 正在清理: $($item.Name) ($sizeBeforeMB MB)" -ForegroundColor Yellow # 执行删除 Get-ChildItem -Path $path -Recurse -Force -ErrorAction SilentlyContinue | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue # 统计清理后大小 $sizeAfter = (Get-ChildItem -Path $path -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum $freed = ($sizeBefore - $sizeAfter) / 1MB $totalFreed += $freed Write-Host "[完成] $($item.Name) 释放约 $([math]::Round($freed, 2)) MB" -ForegroundColor Green } else { Write-Host "[跳过] $($item.Name) 已无可清理内容" -ForegroundColor Yellow } } # 清理回收站 Write-Host "[执行] 正在清理回收站" -ForegroundColor Yellow Clear-RecycleBin -Force -ErrorAction SilentlyContinue Write-Host "==== 磁盘清理结束: 共释放约 $([math]::Round($totalFreed, 2)) MB ====" -ForegroundColor Green把脚本保存为ps1文件后,以管理员身份打开 PowerShell 执行:
# 如果执行策略阻止脚本运行 Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force # 运行清理脚本 powershell -ExecutionPolicy Bypass -File "C:\Scripts\Invoke-DiskCleanup.ps1"这套脚本的核心逻辑是“先测大小再删除”,每一步都有输出,方便确认释放效果。以后做批量维护,只需要把脚本拷贝到目标机器上执行就行。
4.3 方案三:BleachBit 开源工具
如果需要图形界面,又不想付费买各种管家类软件,推荐 BleachBit。它开源、免费、支持 Windows 和 Linux,可以在官网或 GitHub 仓库下载便携版,解压后直接运行。
BleachBit 支持的清理项比 Windows 自带工具多很多,能识别 Chrome、Firefox、Edge 的缓存,以及各种开发工具的 log 目录。首次启动时勾选清理项,点击“清理”即可。它还支持命令行模式:
# BleachBit 命令行示例 bleachbit_console.exe --clean system.cache system.tmp命令行模式适合批量运维,可以脚本化执行。
5. 功能测试与效果验证
清理脚本写完之后,重点不是“看着它运行完”,而是要确认三个问题:有没有真正释放空间、有没有误删、哪些文件删不掉。
5.1 查看磁盘容量变化
清理前后各执行一次:
Get-Volume -DriveLetter C | Select-Object DriveLetter, FileSystemLabel, @{N='Size(GB)';E={[math]::Round($_.Size/1GB,2)}}, @{N='FreeSpace(GB)';E={[math]::Round($_.FreeSpace/1GB,2)}}如果脚本运行完,C 盘可用空间没有变化,先不要怀疑脚本无效,大概率是占用空间的文件不在脚本清理范围里。这时候要用磁盘占用分析工具找到大头。
5.2 用 WizTree 找大头目录
WizTree 是 Windows 上扫描速度非常快的磁盘占用分析工具,软件体积小,UI 顶部会按文件大小列出占用排行。正常使用流程是:
- 下载并运行 WizTree。
- 选择要分析的磁盘,点击扫描。
- 按大小排列文件和目录。
- 确认“大头”是不是在临时目录、更新缓存或浏览器缓存里。
- 如果在,用前面脚本清理;如果不在,要人工判断是否可删。
这里要强调:WizTree 是分析工具,不是清理工具。找到大目录之后,要像前面脚本一样,先确认路径性质,再决定删除方式。
5.3 验证磁盘清理命令是否生效
如果用cleanmgr /sageset:1+cleanmgr /sagerun:1方案,验证方式如下:
# 查看 Windows 更新缓存目录当前大小 $updateCache = 'C:\Windows\SoftwareDistribution\Download' if (Test-Path $updateCache) { $size = (Get-ChildItem -Path $updateCache -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum "{0:N2} MB" -f ($size / 1MB) }执行cleanmgr /sagerun:1后,再看同一目录,数字明显变小就说明生效。如果没有任何变化,可能是对应的清理项没有被勾选。
5.4 典型验证结果
在一台正常使用三个月以上的 Windows 11 机器上,执行本文的 PowerShell 清理脚本,常见的释放范围是几个 GB 到十几个 GB。临时目录、Windows 更新缓存和缩略图缓存通常能释放 2GB 到 5GB;如果系统升级残留Windows.old存在,释放空间甚至可以到 20GB 以上。
这里不写死具体数字,因为实际释放量和系统使用时间、更新频率、应用习惯强相关。一台从不清理的电脑,首次清理效果会非常明显;定期清理的电脑,释放空间会逐渐趋近于零。
6. 接口 API 与批量任务
官方说明:本文三种方案都是本地清理工具,不涉及 HTTP API 服务。如果你需要把清理能力集成到自己的运维系统里,可以从“命令行接口”这个角度理解调用方式。
6.1 用计划任务实现定时清理
不需要在自己写的程序里调用,Windows 任务计划程序本身就支持定时执行。
# 创建一个每天中午 12 点执行的清理任务示例 $action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-ExecutionPolicy Bypass -File "C:\Scripts\Invoke-DiskCleanup.ps1"' $trigger = New-ScheduledTaskTrigger -Daily -At '12:00' $principal = New-ScheduledTaskPrincipal -UserId 'SYSTEM' -LogonType ServiceAccount -RunLevel Highest Register-ScheduledTask -TaskName 'Daily Disk Cleanup' -Action $action -Trigger $trigger -Principal $principal -Force这个任务会用 SYSTEM 账户运行,权限足够清理系统临时目录。创建后可以在任务计划程序库中看到任务状态。
6.2 批量清理多台电脑
对于需要维护多台电脑的场景,可以写一个简单的远程执行脚本:
# 远程批量执行清理示例,需要提前配置 WinRM $computers = @('PC-01', 'PC-02', 'PC-03') foreach ($computer in $computers) { try { Invoke-Command -ComputerName $computer -ScriptBlock { powershell -ExecutionPolicy Bypass -File "C:\Scripts\Invoke-DiskCleanup.ps1" } -Credential (Get-Credential) Write-Host "$computer 清理完成" -ForegroundColor Green } catch { Write-Host "$computer 清理失败: $($_.Exception.Message)" -ForegroundColor Red } }远程批量执行前要确认 WinRM 服务状态、防火墙策略和目标机上脚本路径可用。如果没有配置域环境,建议先用Test-WSMan检查目标机器连通性。
Test-WSMan -ComputerName 'PC-01'6.3 给团队做“一键清理.bat”
如果你不是运维,只是帮同事做一次清理,用以下批处理更方便:
@echo off :: OneClickClean.bat :: 需要以管理员身份运行 echo ================================ echo OneClick Disk Cleanup echo ================================ echo [1/4] Clean user temp... del /f /s /q "%TEMP%\*.*" >nul 2>&1 echo [2/4] Clean system temp... del /f /s /q "C:\Windows\Temp\*.*" >nul 2>&1 echo [3/4] Clean Windows Update cache... del /f /s /q "C:\Windows\SoftwareDistribution\Download\*.*" >nul 2>&1 echo [4/4] Clean recycle bin... rd /s /q C:\$Recycle.Bin >nul 2>&1 echo. echo All done. Press any key to exit. pause >nul这个 bat 文件可以直接 U 盘拷贝使用,双击后按提示操作。干净、直接,不会有捆绑软件问题。
7. 资源占用与性能观察
磁盘清理工具自身对资源占用很低,但在实际运行时有几个观察点值得注意。
7.1 清理脚本的资源占用
执行 PowerShell 清理脚本时,主要消耗来自Get-ChildItem -Recurse遍历大目录和Remove-Item删除大量文件。在大目录上,CPU 占用会短暂升高,磁盘 I/O 活动明显,但整机通常不会卡顿。如果遇到系统盘是机械硬盘,删除几十万个小文件可能需要较长时间,这是硬盘随机读写性能决定的。
建议观察方式:清理时打开任务管理器,查看磁盘活动百分比。PowerShell 遍历目录阶段,磁盘占用会到 100%,这是正常现象;删除阶段波动较大;结束后恢复平稳。
7.2 系统自带 cleanmgr 的资源占用
cleanmgr在执行扫描时会短暂占用较高 CPU,扫描进度条走完后,进入删除阶段时占用回落。由于cleanmgr /sagerun是静默运行,建议通过任务管理器确认进程处于运行状态,不要误以为卡死。
7.3 清理对整机性能的影响
磁盘剩余空间长期低于 10% 时,Windows 运行会变慢,主要原因是页面文件、临时文件写入空间不足,以及系统无法有效进行磁盘碎片整理。清理后可用空间回到 20% 以上,系统响应会恢复。注意观察的是 Windows 更新能否正常进行。
7.4 如何观察清理后的磁盘性能
# 查看磁盘剩余空间历史变化,简单直观 Get-PSDrive C | Select-Object @{N='Used(GB)';E={[math]::Round($_.Used/1GB,2)}}, @{N='Free(GB)';E={[math]::Round($_.Free/1GB,2)}}日常维护时也不用反复跑大脚本。建议先跑一次,记录释放量;之后每周跑一次增量清理就行了。
8. 常见问题与排查方法
磁盘清理遇到的问题非常固定,这里整理了一份排查表。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 清理脚本提示“拒绝访问” | 未以管理员身份运行 | 查看 PowerShell 是否以管理员启动 | 右键 PowerShell,选择“以管理员身份运行” |
| Temp 目录内部分文件删不掉 | 文件正被系统或程序占用 | 查看报错文件名与进程 | 不强制处理,跳过即可;重启后重试 |
| cleanmgr /sagerun 没有任何效果 | 配置里未勾选清理项 | 重新运行 cleanmgr /sageset:1 检查勾选状态 | 勾选需要的清理类别后再执行 |
| C 盘清理后可用空间变化很小 | 大头文件不在临时目录中 | 用 WizTree 扫描磁盘分析 | 根据分析结果处理超大型文件 |
| Windows 更新缓存清理失败 | SoftwareDistribution 服务正在运行 | 检查 Windows Update 服务状态 | 可先停服务再清理,随后重启服务 |
| 执行策略阻止脚本运行 | PowerShell ExecutionPolicy 限制 | 查看 Get-ExecutionPolicy 状态 | 临时使用 -ExecutionPolicy Bypass |
| 回收站无法清空 | 回收站文件被占用或已损坏 | 查看回收站是否有单独损坏项 | 使用 rd /s /q C:$Recycle.Bin 后重建 |
| 磁盘清理工具扫描很慢 | 需要扫描的文件数量极大 | 观察磁盘活动 | 等待完成,或先终止再用 PowerShell 定向清理 |
| 清理后系统启动变慢 | 缩略图缓存、图标缓存被清空后需要重建 | 观察是否只是首次启动慢 | 正常现象,重启后缓存自动生成 |
| Windows.old 目录无法删除 | 目录受系统权限保护 | 查看磁盘清理中“以前的 Windows 安装”项 | 使用系统自带磁盘清理勾选该项处理 |
8.1 处理文件被占用的问题
清理时最常见的报错就是“文件正在被使用”。遇到这种情况,先看哪个程序在占用,关掉对应程序再清理。如果无法定位,可以短暂重启再执行清理,不要强行结束系统进程。
8.2 处理 system32 目录下的文件
清理脚本只应该处理Temp、SoftwareDistribution\Download这类明确安全的目录。如果在分析过程中发现某个大目录位于System32下,不要用第三方工具强行删除,风险极大。正确做法是先搜索该目录用途,再决定处理方案。
8.3 如何判断清理是否误删
最直接的方法是看脚本输出。每个清理项都记录了目录名称、清理前大小和释放空间。如果你担心某个目录被误删,可以在目标目录被清理前自行备份到其他位置。从脚本设计来看,所有路径都是 Windows 标准缓存目录,不存在用户个人文件。
9. 最佳实践与使用建议
9.1 先分析再清理
任何磁盘清理开始前,先做离线分析。这个习惯能避免大量无效操作。磁盘占用分析时间成本极低,WizTree 扫完一个 1TB 硬盘通常只需要几十秒,远低于猜路径删文件的成本。
9.2 保持一套最小可运行清理脚本
不要在维护机器时临时敲命令。建议维护一套固定脚本,放在统一的工具目录,例如C:\Scripts\DiskCleanup。脚本内容尽量只包含“安全目录”,让输出结果可读。维护多个机器时,固定脚本能保证行为一致。
9.3 定期维护而不是等满了再处理
磁盘空间报警后再清理,往往只能解决眼前的更新或安装需求。比较合理的频率是每月做一次临时文件和更新缓存清理,每季度做一次完整磁盘分析,确认是否有大型文件持续增长。
9.4 清理工具只用来源可靠的
Windows 自带工具、PowerShell 脚本、BleachBit、WizTree,这些都是公开渠道能获取的方案。避免从下载站下载“优化大师”“清理助手”类软件,这类软件中最坏的情况可能包含推广绑定甚至恶意行为。命令行方案可控性更强,适合技术维护场景。
9.5 给关键目录加保护
在 PowerShell 清理脚本中加入排除项,防止误伤重要目录:
# 在 Remove-Item 前增加判断,跳过指定关键目录 $excludePaths = @( "$env:USERPROFILE\Documents", "$env:USERPROFILE\Desktop", "$env:USERPROFILE\Downloads" ) foreach ($path in $targets) { # 如果目标路径在排除列表中则跳过 if ($excludePaths -contains $path.Path) { Write-Host "[保护] 跳过排除目录: $($path.Path)" -ForegroundColor Magenta continue } # 实际清理逻辑... }9.6 数据备份和恢复
如果清理前没有做系统还原点,而清理后又出现异常,可以先尝试通过 Windows 的“系统还原”恢复到清理前的状态。这要求机器开启了系统保护功能。运维场景中,建议把系统还原点创建也加入清理脚本,成本极低,收益很高。
10. 总结与下一步
这个“一键清理”主题真正值得收藏的地方在于:它不依赖任何付费工具,也不用装各种管家软件。Windows 自带磁盘清理加一个 PowerShell 脚本,已经能处理 90% 的临时文件和缓存问题;遇到占比不明确的大型目录,用 WizTree 几分钟就能定位。
如果你的电脑 C 盘已经爆红,先执行cleanmgr /sageset:1,手动勾选一次清理项目,然后跑cleanmgr /sagerun:1。如果临时目录和更新缓存已经清理过,还是不够用,直接用 WizTree 扫描,按照空间占用排行去处理,这是最快的路径。
最容易踩的坑有两个:一是没有用管理员权限运行脚本,清理一半报错;二是删除前不确认路径,把不该删的文件顺手带走。保持先分析、再备份、后清理的顺序,这套流程足够稳定。
下一步可以考虑把清理脚本接到 Windows 计划任务里,每周定时跑一次;或者把相同思路改写成 Linux 下的 bash 清理脚本,用在服务器 temp 目录和包管理器缓存上。清理工具永远不嫌多,关键是你得有一套自己能完全控制的方案。