news 2026/8/30 4:01:47

Windows系统盘爆满?用PowerShell深度清理C盘垃圾文件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows系统盘爆满?用PowerShell深度清理C盘垃圾文件

Windows 系统用久了,C 盘空间总是会一点点变少。很多人打开磁盘属性一看,明明没装多少软件,系统分区却已经标红,甚至只剩几个 GB 的可用空间。这种情况下用系统自带的磁盘清理点一遍,通常只能回收几百 MB,和预期差距很大。真正占空间的其实是 Windows 更新留下的旧组件、系统临时目录里的零碎文件、休眠文件、缩略图缓存、日志文件,以及软件运行时产生的各类临时数据。本文要讨论的就是这些垃圾文件到底藏在哪里、哪些可以安全删除、为什么一次清理能释放出几个 GB 甚至 10 GB 以上的空间,以及如何用 PowerShell 和 Windows 自带命令写一个相对可控的深度清理流程。

这篇文章适合被系统盘空间不足困扰的普通用户,也适合需要维护办公电脑、测试机的开发者和运维人员。阅读后会得到一个可以直接执行的清理思路和脚本框架,同时会知道哪些文件绝对不要碰、清理后如何验证效果、遇到“资源保护找到了损坏文件但无法修复”这类提示时该怎么处理。清理操作本身有一定的风险,因此本文会把“安全边界”放在和“清理步骤”同等重要的位置。

1. 先搞清楚 Windows 系统里的“垃圾文件”到底指什么

1.1 垃圾文件不是某种单一文件,而是一批分散在不同位置的无效数据

很多用户对垃圾文件的印象是浏览器的缓存、安装包的残留,或者回收站里还没清空的文件。但在 Windows 系统盘空间占用里,真正的“大头”往往不是这些显而易见的东西,而是系统自己生成、自己维护、又不自动删除的临时数据。

常见的系统垃圾文件来源包括:

  • 用户临时目录里的文件,例如登录用户执行安装包、解压程序时留下的临时文件。
  • Windows 更新下载缓存,也就是C:\Windows\SoftwareDistribution\Download目录下的内容,这里面往往是好几 GB 的更新包。
  • Windows 更新卸载旧版本系统组件后留下的备份,通常在C:\Windows\WinSxS目录下积累。
  • 缩略图缓存、字体缓存、图标缓存,这类文件位置分散,但累计起来也不小。
  • Windows 事件日志、错误报告(WER)文件、崩溃转储文件。
  • 软件安装或运行过程中生成的缓存,例如各种 IDE、浏览器、输入法、视频剪辑软件的缓存目录。
  • 回收站中的残留、休眠文件、系统还原点等。

这些文件有一个共同点:它们属于“可以删除但不影响系统正常运行”的数据。删除之后,要么系统会自动重建,要么后续不会再需要。这也是“一键清理 10G 垃圾文件”这个说法的现实基础,区别只在于清理脚本是否覆盖了这些目录、是否考虑了文件占用和权限问题。

1.2 为什么不建议直接手动进入 C 盘目录乱删

手动清理遇到的最大问题是路径分散。C:\Windows\TempC:\Users\用户名\AppData\Local\TempC:\Windows\SoftwareDistribution\DownloadC:\ProgramData下的缓存目录,每个地方都要单独进入,而且不少目录需要管理员权限才能访问。稍不注意就会误删正在使用的文件,或者删到一半因为文件被占用而中断。

另一个问题是文件占用。系统运行时会有大量 DLL、日志文件、临时文件被进程锁住,直接删除会提示“文件正在使用”。因此一个可靠的清理脚本,必须处理跳过占用文件的逻辑,同时要能统计出每个目录实际释放了多少空间。

建议普通用户不要直接操作C:\Windows目录里的内容。下文给出的脚本会先列出可清理位置,再执行删除,并用变量记录清理前后的磁盘空间差。这样即使某个文件被占用,也不会导致脚本异常中断。

2. 先了解系统自带的清理能力,再决定是否需要写脚本

2.1 磁盘清理工具和存储感知能清理什么

Windows 系统自带了两套清理机制:传统的“磁盘清理”和设置里的“存储感知”。

打开磁盘清理的方式很简单:

cleanmgr

在“要删除的文件”列表里勾选项目后,系统会删除临时文件、回收站内容、缩略图等。如果点击“清理系统文件”,还能看到 Windows 更新清理、旧的 Windows 安装文件等选项。

存储感知位于“设置 -> 系统 -> 存储”,打开后可以配置自动清理临时文件和回收站内容。

这两套方案的优势是安全,系统只会删掉它认为可以删除的文件。问题是不够深入:

  • 磁盘清理默认清理粒度较粗,难以覆盖某些软件自行创建的缓存目录。
  • Windows 更新清理在磁盘清理界面经常显示不出来,或者提示的大小和实际可释放空间不一致。
  • 清理过程没有详细日志,用户无法知道到底删除了哪些文件、释放了多少空间。
  • 对于 WinSxS 组件存储中的旧版本组件,磁盘清理不能彻底清理,需要使用 DISM 命令。

这里就能看出写一个针对性清理脚本的价值:可以精确指定目录,记录日志,统计释放空间,把分散的清理动作合并成一次执行。

2.2 游戏玩家场景下的批处理优化和清理有什么关系

网络上有不少求“Windows 游戏性能优化 bat 脚本”的需求,其中通常包含关闭后台服务、调整电源模式、清理系统临时文件等步骤。游戏场景下磁盘垃圾清理的意义在于:当临时文件过多时,磁盘 IO 会被拉低,系统读取游戏资源、写入存档或触发虚拟内存交换时会有更大概率卡顿。清掉临时文件、更新缓存和日志,能减少系统在随机读写上的负担。

但要注意,清理脚本不是玄学优化。它不会把 60 帧变成 144 帧,也不会显著提升 CPU 和显卡性能。它的主要贡献是释放磁盘空间,减少因为磁盘空间不足导致的系统异常和虚拟内存扩展问题。因此,对于游戏玩家,清理脚本可以作为日常维护的一部分,但不要指望它有“性能翻倍”的效果。

下文的核心脚本同样适用于游戏电脑的日常清理。如果还需要调整电源模式为高性能、关闭后台服务,可以在清理脚本之后追加对应的powercfgsc config命令,但请务必逐条确认服务名和影响范围。

3. 编写一个可复现的 Windows 系统深度清理脚本

3.1 脚本设计原则和运行方式

在编写脚本之前,先确定几条原则:

  1. 清理过程必须以管理员权限运行,否则很多系统目录无法访问。
  2. 脚本只删除确定安全的目录中的内容,不直接删除整个用户目录或系统目录。
  3. 删除前先记录待清理目录的大小,删除后汇总释放空间。
  4. 遇到被占用文件时跳过而不是中断。
  5. 不清理 Windows 正在使用的服务级日志目录,例如C:\Windows\Logs下正在写入的日志。

下面的脚本以 PowerShell 演示。原因有三:PowerShell 访问文件系统能力更强,统计目录大小更方便,也更容易扩展后续的 DISM 清理步骤。

在桌面新建一个文件,命名为Windows-Cleaner.ps1,右键“使用 PowerShell 运行”,或者在管理员 PowerShell 窗口中执行:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass powershell -NoProfile -ExecutionPolicy Bypass -File Windows-Cleaner.ps1

实际项目中不要随意修改本地执行策略。推荐做法是仅在当前进程临时放开策略,脚本执行结束后自动失效。

3.2 统计目录大小的辅助函数

清理前后对比释放空间,必须知道每个目录的字节数。PowerShell 获取目录大小的通用方式如下:

function Get-DirectorySize { param([string]$Path) if (-not (Test-Path $Path)) { return 0 } $size = 0 try { $size = (Get-ChildItem -LiteralPath $Path -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum } catch { $size = 0 } if ($null -eq $size) { return 0 } return [math]::Round($size / 1MB, 2) }

该函数的作用是递归统计目录下所有文件的字节数,并换算成 MB。-ErrorAction SilentlyContinue用于跳过无权限或已被占用的文件,避免脚本弹出大量红色报错。

函数返回的单位是 MB,下面在计算总大小时会保持一致。

3.3 安全可清理目录清单与删除逻辑

在脚本中维护一个目录清单,对每个目录执行同样的逻辑:先记录大小,再删除内容,最后再次统计大小,二者差值就是实际释放空间。

$targets = @( "C:\Windows\Temp", "$env:LOCALAPPDATA\Temp", "C:\Windows\SoftwareDistribution\Download", "$env:LOCALAPPDATA\Microsoft\Windows\Explorer", "C:\ProgramData\Microsoft\Windows\WER\ReportQueue", "C:\ProgramData\Microsoft\Windows\WER\ReportArchive" ) $totalFreed = 0 foreach ($target in $targets) { if (-not (Test-Path $target)) { continue } $before = Get-DirectorySize -Path $target Get-ChildItem -LiteralPath $target -Force -ErrorAction SilentlyContinue | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue $after = Get-DirectorySize -Path $target $freed = [math]::Round($before - $after, 2) $totalFreed += $freed Write-Host ("{0,-60} 释放: {1,8} MB" -f $target, $freed) }

这段代码的关键点是:

  • Get-ChildItem先拿到目录下的所有子项,再交给Remove-Item删除。
  • -ErrorAction SilentlyContinue保证遇到被占用的文件时跳过,而不是报错中断。
  • 删除前后使用同一个统计函数,能直观看到每个目录的清理效果。
  • $env:LOCALAPPDATA\Temp是当前用户的临时目录,不同用户清理的范围不同。如果你的电脑存在多个用户账户,需要逐个登录清理,或者配合系统管理员权限清理其他用户配置文件下的 Temp 目录。

3.4 回收站、缩略图缓存和浏览器缓存的清理

回收站可以通过 PowerShell 的Clear-RecycleBin清理:

Clear-RecycleBin -DriveLetter C -Force -ErrorAction SilentlyContinue

-Force表示不询问确认。如果回收站本身是空的,这行命令不会报错,因为使用-ErrorAction SilentlyContinue屏蔽了提示。

缩略图缓存在C:\Users\用户名\AppData\Local\Microsoft\Windows\Explorer目录下。删除缩略图缓存不会损坏图片文件,只会让下次打开文件夹时重新生成缩略图。在文件资源管理器里看到缩略图显示异常时,清理该目录是标准修复手段。

浏览器缓存这块要谨慎。Chrome 和 Edge 浏览器的缓存目录都可以清理,但清理后所有网站需要重新加载资源。若你担心清理登录状态,请不要直接删除整个浏览器配置文件目录,只删除其中的Cache子目录即可。下面的命令用于清理 Edge 的缓存目录:

$edgeCache = "$env:LOCALAPPDATA\Microsoft\Edge\User Data\Default\Cache\Cache_Data" if (Test-Path $edgeCache) { Get-ChildItem -LiteralPath $edgeCache -Force -ErrorAction SilentlyContinue | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue }

不同版本浏览器缓存目录结构可能不同,建议先确认路径存在再执行。

3.5 清理结果统计和日志输出

清理完成后,希望脚本输出三组数据:每个目录释放空间、总释放空间、磁盘剩余空间变化。

$disk = Get-PSDrive C $totalFreedGB = [math]::Round($totalFreed / 1024, 2) Write-Host "----------------------------------------------" Write-Host ("本次清理释放空间总计: {0} MB ({1} GB)" -f $totalFreed, $totalFreedGB) Write-Host ("C 盘当前剩余空间: {0} GB" -f [math]::Round($disk.Free / 1GB, 2))

Get-PSDrive C可以返回 C 盘的总容量和剩余空间。建议在脚本开头先记录一次清理前的剩余空间,脚本末尾再次记录,让用户看到前后变化。

如果想把清理日志写到文件里,可以用Start-TranscriptStop-Transcript包裹整个清理过程:

Start-Transcript -Path "C:\CleanLog_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt" # 清理逻辑 Stop-Transcript

日志文件建议放在非系统盘,避免日志写入影响正在清理的 C 盘空间统计。

4. 清理磁盘空间“大户”:更新备份、休眠文件、系统还原和 WinSxS

4.1 Windows 更新缓存和旧组件为什么能占好几个 GB

C:\Windows\SoftwareDistribution\Download是 Windows 更新下载安装包的默认位置。每次系统更新,下载的安装包都会落到这里,安装完成后,这些文件往往不会被自动清除。日积月累,这里积压的更新包内容就能占几个 GB。

比 Download 目录更隐蔽的是C:\Windows\WinSxS下的组件备份。Windows 更新在替换系统文件时,会把旧版本文件保留下来,以便需要时可以回滚。这些旧版本组件不会自动消失,必须在确认系统稳定后手动触发清理。

清理 WinSxS 不能直接删除目录,需要使用 DISM 命令:

Dism.exe /Online /Cleanup-Image /StartComponentCleanup

这条命令会删除被取代的旧组件版本,并且不会影响系统回滚能力的基础。因为只清理被替代的组件,不是删除全部备份。

如果想以安静模式运行,不显示进度和提示:

Dism.exe /Online /Cleanup-Image /StartComponentCleanup /Quiet

运行前可以先分析可清理的组件大小:

Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore

输出中会显示“组件存储( WinSxS )大小”和“实际使用大小”,二者差值越小,说明可清理的旧组件越少。如果一个刚装完系统的机器只显示几百 MB 可清理,这是正常的;更新过多次系统补丁的机器,清理收益往往更大。

WinSxS 清理很耗时,可能持续 20 分钟甚至更久。在虚拟机、老旧电脑、机械硬盘上运行时要预留足够时间,不要中途强制关机。

4.2 休眠文件的清理和误以为可以删除的坑

休眠文件C:\hiberfil.sys通常大小接近物理内存容量。8 GB 内存的电脑,这个文件可能就有 6 到 8 GB。它的作用是保存休眠时内存中的数据,以便下次开机恢复到休眠前状态。

如果从不使用休眠功能,可以关闭它:

powercfg /h off

关闭后hiberfil.sys会被删除。但要注意,关闭休眠也会导致“快速启动”功能失效。快速启动是 Windows 10/11 里默认开启的功能,它利用休眠技术加快开机速度。如果你依赖快速启动,就不要关闭休眠文件。

折中方案是把休眠文件压缩为“完整休眠”模式:

powercfg /h /type reduced

reduced模式产生的休眠文件更小,但不再支持完整休眠恢复,只支持快速启动。具体效果与系统版本、驱动和电源管理有关,落地前先确认自己对休眠和快速启动的需求。

4.3 系统还原点和旧的 Windows 安装文件

系统还原点是另一个容易忽略的占空间项。查看当前还原点占用:

vssadmin list shadowstorage

输出中会显示“已使用的存储空间”和“分配的最大空间”。如果系统还原占用过大,可以在“系统保护”设置里调整最大占用比例,或者清除较旧的还原点。删除所有还原点会导致系统失去旧时间点的回退能力,在系统稳定运行且即将安装大更新前,不建议把还原点全部清空。

C:\Windows.old目录则出现在从旧版本 Windows 升级到新版本之后,它保存了旧系统文件,用于在一定期限内回滚。确认新系统运行正常后,可以使用磁盘清理的“清理系统文件”功能删除它。也可以通过命令行:

cleanmgr /d C /sagerun:1

但更直观的方式还是磁盘清理界面里的“以前的 Windows 安装”选项。直接手动删除C:\Windows.old需要获取所有权和修改 ACL,操作复杂且容易出错,不推荐。

4.4 临时安装文件和软件缓存目录的扩展清理

除了系统目录,以下常见软件缓存也值得清理,但清理前必须理解清除后果:

缓存位置对应软件清理后果
C:\Users\用户名\AppData\Local\pip\cachePython pip 下载缓存下次安装 Python 包需重新下载
C:\Users\用户名\AppData\Local\NPM\CacheNode.js npm 缓存下次 npm install 需重新下载
C:\Users\用户名\.gradle\cachesGradle 构建缓存下次构建会重新解析依赖,耗时变长
C:\Users\用户名\.m2\repositoryMaven 本地仓库直接删除会导致所有 Maven 项目重新下载依赖,强烈不建议整目录删除;只删除*.lastUpdated文件即可
C:\Users\用户名\AppData\Local\Temp\JetBrainsJetBrains IDE 缓存下次启动 IDE 会重新建立索引,速度变慢
C:\Windows\Prefetch预读取文件可清理,但提升空间小,对老电脑可能反而影响启动速度

其中 Maven 本地仓库的价值很高,不能简单视为垃圾。只能清理下载失败留下的.lastUpdated文件,这是构建加速中最值得保留的缓存目录,不要误删。

这些开发工具缓存不在通用清理脚本里出现,因为不同机器安装的软件差异很大。可以在脚本里以“可选模块”的方式加入,让使用者自行决定是否启用。

5. 哪些文件不能清理,以及误删后的修复思路

5.1 不能直接删除的目录和文件

清理脚本即使做得很完善,也必须有边界。以下内容不能出现在清理清单里:

  • C:\Windows\System32下的任何 DLL、EXE 和配置文件。
  • C:\Program FilesC:\Program Files (x86)下已安装软件的目录,卸载软件要走安装程序的卸载流程,不能直接删目录。
  • 用户目录下的“文档”“图片”“桌面”“下载”“视频”等个人数据目录。
  • 项目代码目录、数据库文件、虚拟机和容器镜像文件。
  • 正在被进程占用的文件。PowerShell 的Remove-Item遇到占用会跳过,但某些不带-ErrorAction SilentlyContinue的脚本可能直接抛出异常。

日志类文件的清理也要注意。C:\Windows\Logs下存在正在写入的 IIS、CBS、DISM 日志,删除了系统会继续创建,但可能让正在进行的排障失去线索。建议只清理C:\ProgramData\Microsoft\Windows\WER下的历史错误报告,不要动C:\Windows\Logs

5.2 清理后系统异常的常见表现和处理

清理本身如果只删除上面列出的目录,一般不会造成系统故障。但有些用户会把“深度清理”误解为连注册表、驱动缓存、字体缓存一起清理,这就容易出问题。

可能看到的异常表现包括:

  • 桌面图标和字体显示异常。
  • 缩略图不显示或重建缓慢。
  • 软件启动报缺少 DLL。
  • 系统更新失败,提示组件存储损坏。
  • 系统开机后一段时间内明显卡顿,这是因为各种缓存被清空后需要重新生成。

处理思路是:先确认异常文件来自哪里,再决定是恢复还是重建。例如字体异常,可以重新安装对应字体;缩略图异常,重启资源管理器即可。如果出现系统文件损坏,可以运行系统文件检查器:

sfc /scannow

5.3 碰到“资源保护找到了损坏文件但无法修复”怎么处理

运行sfc /scannow时,有一定概率遇到这样的输出:

Windows 资源保护找到了损坏文件,但其中有一些文件无法修复。 对于联机修复,位于 C:\Windows\Logs\CBS\CBS.log 的日志文件中包含详细信息。

出现这个提示不等于系统坏了,它只说明 SFC 尝试从本地 Windows 映像恢复文件时失败了。先不要急着重装系统,按下面的顺序排查。

第一类原因:Windows 映像源本身损坏。SFC 修复文件时,需要从组件存储中复制原始文件。如果组件存储已经损坏,SFC 就无法完成修复。这时使用 DISM 先修复映像:

Dism.exe /Online /Cleanup-Image /RestoreHealth

这条命令会扫描组件存储并尝试联机修复。完成后再次运行sfc /scannow。如果 DISM 也失败,检查网络和 Windows 更新服务是否正常,因为联机修复有时需要访问 Windows 更新。

第二类原因:第三方软件替换了系统文件。有些优化工具、破解工具会覆盖系统 DLL。SFC 检测到文件哈希异常,但当前系统正在使用这个文件,无法在线替换。这时可以尝试重启到安全模式再运行 SFC,减少第三方软件对系统文件的占用。

第三类原因:磁盘损坏导致文件无法读取。chkdsk可以检查文件系统错误:

chkdsk C: /f /r

/f修复文件系统错误,/r扫描磁盘坏扇区并恢复可读信息。运行后需要重启电脑,执行时间取决于磁盘容量和损坏程度。机械硬盘有坏道时,这一步可能耗时数小时。

如果系统文件损坏范围很大,且上述步骤无法修复,建议备份个人数据后使用“重置此电脑”或镜像重装。正常清理脚本不会触发这种故障,只有误删系统目录或使用了不安全的“注册表深度清理”才会提高这个风险。

5.4 如何避免清理脚本误删正在使用的文件

脚本中加入占用文件跳过逻辑,只是兜底。更好的方式是在清理前执行以下检查:

  1. 检查是否有大量进程在读写目标目录。常见的占用源包括 Windows Update 服务、杀毒软件、浏览器后台进程。
  2. 清理 Windows 更新目录前,最好先停止 Windows Update 服务。在管理员 PowerShell 中执行:
Stop-Service -Name wuauserv -Force -ErrorAction SilentlyContinue # 清理 C:\Windows\SoftwareDistribution\Download 下的内容 Start-Service -Name wuauserv -ErrorAction SilentlyContinue

先停服务再清理,能减少删除失败,清理也更彻底。清理后必须重新启动 Windows Update 服务,否则系统更新会异常。

  1. 不要在 Windows 更新正在安装的时候运行清理脚本。此时 Windows 更新占用了大量临时文件和系统文件,删除可能中断更新,导致系统状态不一致。

6. 完整深度清理脚本:把上面的内容整合成可操作版本

6.1 脚本整体结构

下面整合一个DeepClean.ps1脚本,包含临时目录清理、Windows 更新缓存清理、缩略图缓存清理、错误报告清理、回收站清理和可选的开发工具缓存清理。脚本分为三部分:初始化、执行清理、输出报告。

# DeepClean.ps1 - Windows 深度清理脚本 # 必须以管理员权限运行 $ErrorActionPreference = "Continue" $logFile = "C:\CleanLog_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt" function Get-DirectorySize { param([string]$Path) if (-not (Test-Path $Path)) { return 0 } $size = 0 try { $size = (Get-ChildItem -LiteralPath $Path -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum } catch { $size = 0 } if ($null -eq $size) { return 0 } return [math]::Round($size / 1MB, 2) } function Clear-TargetDirectory { param([string]$Path) if (-not (Test-Path $Path)) { Write-Host ("跳过不存在的目录: {0}" -f $Path) return 0 } $before = Get-DirectorySize -Path $Path Get-ChildItem -LiteralPath $Path -Force -ErrorAction SilentlyContinue | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue $after = Get-DirectorySize -Path $Path $freed = [math]::Round($before - $after, 2) if ($freed -gt 0) { Write-Host ("{0,-60} 释放: {1,8} MB" -f $Path, $freed) } return $freed } $totalFreed = 0 # 清理前磁盘状态 $diskBefore = Get-PSDrive C Write-Host ("清理前 C 盘剩余空间: {0} GB" -f [math]::Round($diskBefore.Free / 1GB, 2)) Write-Host "----------------------------------------------" # 基础临时目录 $totalFreed += Clear-TargetDirectory -Path "C:\Windows\Temp" $totalFreed += Clear-TargetDirectory -Path "$env:LOCALAPPDATA\Temp" # Windows 更新缓冲目录(先停止更新服务再清理) Stop-Service -Name wuauserv -Force -ErrorAction SilentlyContinue $totalFreed += Clear-TargetDirectory -Path "C:\Windows\SoftwareDistribution\Download" Start-Service -Name wuauserv -ErrorAction SilentlyContinue # 缩略图缓存 $totalFreed += Clear-TargetDirectory -Path "$env:LOCALAPPDATA\Microsoft\Windows\Explorer" # Windows 错误报告 $totalFreed += Clear-TargetDirectory -Path "C:\ProgramData\Microsoft\Windows\WER\ReportQueue" $totalFreed += Clear-TargetDirectory -Path "C:\ProgramData\Microsoft\Windows\WER\ReportArchive" # 回收站 Clear-RecycleBin -DriveLetter C -Force -ErrorAction SilentlyContinue Write-Host "回收站已清空" # 清理后的磁盘状态 $diskAfter = Get-PSDrive C $usableFreed = [math]::Round(($diskAfter.Free - $diskBefore.Free) / 1MB, 2) Write-Host "----------------------------------------------" Write-Host ("目录统计释放空间: {0} MB" -f [math]::Round($totalFreed, 2)) Write-Host ("C 盘剩余空间增加: {0} MB ({1} GB)" -f $usableFreed, [math]::Round($usableFreed / 1024, 2)) Write-Host ("清理后 C 盘剩余空间: {0} GB" -f [math]::Round($diskAfter.Free / 1GB, 2)) Start-Sleep -Seconds 5

脚本里几个细节值得注意。

$totalFreed统计的是脚本显式清理目录释放的空间。磁盘剩余空间增量$usableFreed可能大于$totalFreed,因为回收站、WinSxS 清理等动作没有被计入目录统计。如果增量明显小于统计值,说明某些文件被占用并跳过,或清理过程中有其他进程在写数据。

6.2 扩展:集成 DISM 和休眠文件的“深度模式”

在上面的脚本中追加以下内容,就变成了“深度清理”:

# 深度清理 - 建议单独执行 Write-Host "正在分析组件存储,请稍候..." Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore Write-Host "正在清理被取代的组件,该过程可能较慢..." Dism.exe /Online /Cleanup-Image /StartComponentCleanup /Quiet # 可选: 关闭休眠文件(按需启用) # powercfg /h off

DISM 命令执行时间较长,建议不要放在日常快速清理中,每个月运行一次即可。powercfg /h off是否启用要根据是否使用休眠和快速启动判断,默认不要加进脚本。

6.3 如何调度清理:任务计划程序和手动频率

清理脚本可以手动运行,也可以配置成每周自动执行一次。Windows 下使用任务计划程序创建一个每周任务:

$action = New-ScheduledTaskAction -Execute "powershell.exe" ` -Argument "-NoProfile -ExecutionPolicy Bypass -File C:\Scripts\DeepClean.ps1" $trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At 3:00AM Register-ScheduledTask -TaskName "WeeklyClean" -Action $action -Trigger $trigger -RunLevel Highest

这条命令里的关键点是-RunLevel Highest,它让任务以管理员权限运行。如果省略,脚本访问C:\Windows\Temp时可能因为权限不足而跳过目标目录。

设置了一个定时任务,就要同时考虑任务日志。建议在脚本开头写入Start-Transcript,任务计划程序的“操作”里已经配置了执行方式,日志可以通过脚本内部的输出文件留存。这样即使清理过程中出问题,也能通过日志回看是哪一步造成的。

6.4 清理脚本运行后磁盘剩余空间没有增加怎么办

部分用户运行清理脚本后,发现磁盘剩余空间没有明显变化。先检查以下原因:

现象可能原因处理方式
剩余空间几乎没有变化脚本未以管理员身份运行使用管理员 PowerShell 重新执行
某些目录跳过文件被占用关闭相关软件后重试,或重启后运行
清理后短暂卡顿IDEs、杀毒软件重建缓存索引正常现象,等待索引完成,不要反复清理
释放了几个 GB,但很快又变小系统或软件在持续产生日志和缓存确认是否有异常内存转储、Windows 更新正在下载
WinSxS 清理后变化不大组件存储实际使用率已经很高使用AnalyzeComponentStore查看真实可清理量

如果清理后系统盘剩余空间仍然很小,不要继续盲目清理。更合理的方式是使用磁盘占用分析工具,如TreeSizeWizTreeSpaceSniffer,找到真正的空间大户。这一步经常能发现真正的问题,例如某个用户目录下存在大量备份镜像、WSL 虚拟磁盘文件、Docker 镜像,或者休眠文件巨大。这些内容不属于“垃圾文件”范畴,需要单独处理。

6.5 WSL、Docker 和开发环境占用的空间要不要清理

很多开发者的 C 盘空间不足不是系统垃圾导致的,而是开发环境数据占用了大量空间。例如:

  • WSL 发行版的虚拟磁盘文件ext4.vhdx,可能占几十甚至上百 GB。
  • Docker Desktop 的 WSL2 后端数据。
  • Elasticsearch、Redis、数据库等中间件的数据目录。
  • 多个版本的 JDK、Node.js、Python 或包管理器缓存。

不要通过删目录的方式处理这些数据。WSL 虚拟磁盘可以压缩,但要先关闭 WSL,再使用Optimize-VHD或磁盘压缩工具。Docker 镜像可以使用docker system prune清理悬空镜像和停止的容器。数据目录的迁移需要对应中间件提供服务,否则会破坏运行环境。

所以清理脚本的目标是回收系统层面的垃圾文件,而不是替开发环境“减肥”。开发环境占用的空间要在理解数据生命周期后单独管理。

7. 清理之后:验证系统状态和优化日常维护策略

7.1 如何确认系统没有因为清理而受损

清理成功后,建议按以下顺序做一遍快速验证:

  1. 打开文件资源管理器,确认桌面、库、个人目录都能正常访问。
  2. 打开“设置 -> 系统 -> 存储”,看 C 盘剩余空间是否明显增加。
  3. 打开几个常用软件,确认启动正常,没有报缺失文件错误。
  4. 运行一次 Windows 更新检查:
Get-WindowsUpdate

如果没有安装 Windows Update PowerShell 模块,也可以直接到“设置 -> Windows 更新”里点击“检查更新”。

  1. 如果之前执行过 WinSxS 清理,重启一次电脑,确认系统能正常进入桌面,开始菜单和应用商店都能正常工作。

这些验证步骤只花几分钟,但能避免清理后过了几天才发现异常,却已经找不到对应操作记录的情况。

7.2 系统文件检查的正确顺序

如果清理后系统出现可疑的异常,最常用的检查命令是:

Dism.exe /Online /Cleanup-Image /RestoreHealth sfc /scannow

不要把顺序反过来。SFC 依赖组件存储提供源文件,组件存储损坏时它无法完成修复。DISM 先修复存储源,SFC 再做文件级比对,成功率更高。

如果sfc /scannow报出“发现损坏文件但无法修复”,回到上文 5.3 节的排查思路,先确认是不是组件存储损坏、第三方软件覆盖或磁盘坏道。在实际项目经验里,磁盘坏道导致的 SFC 无法修复并不少见,尤其是在老旧的机械硬盘上。先跑到chkdsk再看 SFC,可以少走弯路。

7.3 日常维护习惯和预防措施

与其等 C 盘标红再清理,不如建立日常维护节奏。以下几点是可落地的建议:

  1. 打开存储感知,配置成每周或每月自动清理临时文件。
  2. 把浏览器下载目录从 C 盘迁到其他分区,避免下载文件长期堆在系统盘。
  3. 开发者把 Maven 本地仓库、Gradle 缓存、npm 缓存放在非系统盘,通过环境变量或配置文件指定路径。
  4. 虚拟机、WSL 镜像、Docker 数据默认放在外置磁盘或空间更大的分区,不要全部默认落到 C 盘。
  5. 每月运行一次 DISM 组件清理,每季度运行一次深度清理脚本。
  6. 不安装来路不明的“垃圾清理大师”“内存优化神器”,它们清理的效果通常不如明确目录,却可能带来弹窗和后台行为。

一个值得养成的习惯是:清理前先看各目录实际占用,再决定操作范围。盲目的“深度清理”比不清理更危险,因为一旦删除过界,恢复成本远超多占用的几 GB 空间。

7.4 游戏玩家和普通办公电脑的清理频率差异

普通办公电脑可以每周自动清理一次临时文件,月度深度清理一次。游戏玩家在安装大型游戏或系统更新之后,可以手动运行一次清理,以回收更新缓存和临时文件。游戏本身若安装在 C 盘,还需要关注游戏的缓存和着色器缓存目录,这些文件在游戏运行时会被重新创建,不需要专门删除。

对于长期运行的重负载服务,如 Elasticsearch、Redis、MySQL 服务器,建议不要在业务高峰运行清理脚本。清理临时文件和高频日志可能引发 IO 抖动,影响服务稳定性。这类机器的清理更适合安排在变更窗口内执行。

8. 常见问题与排错清单

8.1 清理脚本运行报“无法加载文件,因为在此系统上禁止运行脚本”

现象:右键运行.ps1文件时,PowerShell 提示脚本被禁止运行。

原因:默认执行策略Restricted只允许运行单个命令,不允许运行脚本文件。

处理方式,在管理员 PowerShell 中执行:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass powershell -NoProfile -ExecutionPolicy Bypass -File DeepClean.ps1

-Scope Process的作用范围仅限当前窗口,关闭后自动恢复默认值,不改变系统级策略。这是比直接修改 LocalMachine 策略更稳妥的方式。

8.2 清理后 C 盘空间不增反减

出现这种情况有两种可能。

一是清理期间有新的文件在写入。例如 Windows Update 服务重新启动后,立即开始下载新更新;杀毒软件开始生成新的缓存。观察一段时间后,剩余空间会趋于稳定。

二是脚本统计出错。PowerShell 统计目录大小时,Measure-Object会忽略无权限访问的文件。如果某些大文件无法读取,会低估清理前的大小。此时应以磁盘剩余空间增量作为最终结果,而不是脚本里统计出的“目录释放空间”。

8.3 Windows 更新清理后更新失败

如果清理时把C:\Windows\SoftwareDistribution\Download删掉,而 Windows Update 服务正在运行,可能导致当前更新任务的中断。解决办法是重新启动 Windows Update 服务并再次检查更新:

Start-Service -Name wuauserv

清理前最好先检查更新状态,确认当前没有正在下载或安装的更新。完整流程是:停止wuauserv-> 清理下载目录 -> 启动wuauserv-> 手动触发检查更新。

8.4 WinSxS 清理卡住不动

DISM 的StartComponentCleanup在部分机器上确实很慢。这不代表死机,只是组件清理要重新解析和压缩大量文件。可以通过任务管理器观察进程是否还在运行。如果超过两个小时仍然无变化,参考C:\Windows\Logs\CBS\CBS.log最后几条日志,确认是否卡在某个文件上。若怀疑磁盘损坏,先运行chkdsk C: /f再重试。

8.5 清理后桌面图标和开始菜单异常

通常发生在大范围清理用户配置文件缓存时。不要急着重装系统,先重启文件资源管理器:

Stop-Process -Name explorer -Force Start-Process explorer

如果问题仍在,检查 Windows 搜索索引和图标缓存是否被清理。图标缓存文件路径%LOCALAPPDATA%\IconCache.db%LOCALAPPDATA%\Microsoft\Windows\Explorer下的.db文件删除后会自动重建。等待几分钟,或者注销重新登录即可。

真正危险的是清理用户目录下的NTUSER.DAT、系统盘的winload.exe等系统关键文件。只要清理脚本没有包含这些路径,基本不会遇到这类问题。

8.6 是否需要清理注册表

本文不推荐清理注册表。注册表项很小,占用的磁盘空间几乎可以忽略。清理工具扫出来的“无效注册表项”并不会显著释放磁盘空间,反而可能在删除共享 DLL 引用和 COM 组件注册时导致软件无法启动。Windows 本身对注册表的访问速度不会因为项太多而降低,真正影响体验的是磁盘空间、内存和病毒软件。

如果出现了软件安装卸载后残留的右键菜单项或文件关联异常,应该用软件自带的设置或注册表编辑器精准修改,而不是用全盘扫描清理工具。

9. 最佳实践与可复用清单

9.1 清理脚本设计清单

编写或修改清理脚本时,对照下面这份清单检查:

  • 是否通过管理员权限运行。
  • 是否对每个目录进行了删除前大小统计和删除后大小统计。
  • 是否使用了-ErrorAction SilentlyContinue跳过占用文件。
  • 是否在清理 Windows 更新目录前停止wuauserv服务并在清理后恢复。
  • 是否没有包含任何系统关键目录、个人数据目录和软件安装目录。
  • 是否记录了清理日志。
  • 是否在脚本末尾输出磁盘剩余空间前后对比。
  • 是否把 DISM 组件清理与日常清理分离,避免脚本长时间运行。
  • 是否清楚区分了“系统垃圾”和“开发环境数据”,没有把 Maven、npm、Gradle 缓存整目录删除。

9.2 空间排查优先级清单

如果系统盘空间不足,按照以下顺序排查:

  1. 当前用户 Temp 目录和系统 Temp 目录。
  2. Windows 更新下载缓存SoftwareDistribution\Download
  3. WinSxS 组件存储,使用AnalyzeComponentStore分析。
  4. 休眠文件hiberfil.sys,按需压缩或关闭。
  5. 回收站历史残留。
  6. Windows 错误报告目录WER
  7. Windows.old 旧系统备份。
  8. 开发工具缓存:pip、npm、Gradle、Maven、JetBrains。
  9. WSL 虚拟磁盘、Docker Desktop 后端镜像。
  10. 软件安装目录之外的大型数据目录:虚拟机磁盘、数据库备份文件、日志归档。

这一条排查路线比盲目“深度清理”更有效。第 1 到第 7 项是普通垃圾文件清理范围,第 8 项取决于开发环境,第 9 和第 10 项是需要单独管理的真实业务数据,不能当垃圾处理。

9.3 刚清理完不要立即做什么

  • 不要立即运行大型磁盘整理工具,清理和整理同时运行会互相干扰。
  • 不要马上执行权限变更、目录迁移等操作,先确认系统稳定。
  • 不要反复运行多个清理工具,不同清理工具可能会删除彼此需要依赖的缓存文件。
  • 不要在清理后立刻重启并期待空间瞬间恢复到理想状态,有些文件是延迟删除的,需要等系统完成异步清理。

9.4 下一次清理时值得注意的事项

清理是一个持续过程。真正有效的“一键清理”,不是一次性把 C 盘清理到最大,而是让后续每次清理都能快速、安全、可重复。把脚本保存到一个明确位置,比如C:\Scripts\DeepClean.ps1,每次运行前先更新脚本中的目录清单,确保没有因为软件更新而引入新的缓存目录。

生产环境、办公电脑和开发机之间,清理策略也不一样。生产服务器建议只清理系统更新缓存和临时文件,不在业务高峰期执行 WinSxS 清理;办公电脑可以开启存储感知;开发机则优先考虑把大型依赖缓存迁移到非系统盘,让 C 盘占用长期保持在一个稳定水平。这样下来,才不需要每次等到磁盘标红时再焦虑“为什么又满了”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/30 4:01:39

大型国际会议口译服务标准流程:从会前准备到现场执行全指南

国际峰会、行业论坛、跨国发布会、商务谈判……这些场景中,口译服务商扮演着沟通桥梁的角色,口译质量直接决定信息传递的准确性,选错服务商可能导致误解甚至业务损失。判断一家会议口译服务商是否可靠,不能只看报价,要…

作者头像 李华
网站建设 2026/8/30 4:01:31

Codex 零基础完全上手:安装配置、接入 DeepSeek 与常见报错排查

Codex 是 OpenAI 推出的编程代理工具,核心能力不是聊天,而是读取项目文件、修改代码、执行命令,把一个多步骤开发任务拆开并落地完成。2026 年你搜 Codex,搜到的很多已经不是概念介绍,而是安装失败、CLI 路径找不到、模…

作者头像 李华
网站建设 2026/8/30 4:00:44

MATLAB实现接触角自动测量:图像处理与轮廓拟合实战

简介:本资源是一套面向材料科学、表面物理及实验数据分析方向的MATLAB工具集,专为科研人员与高年级本科生设计,用于解决液滴接触角测量与固体表面能反演的核心计算问题。压缩包共含10个.m文件,总大小仅6KB,全部为可直接…

作者头像 李华
网站建设 2026/8/30 3:58:25

Python零基础入门路线:环境配置、核心语法与实战脚本全解析

很多人在入门 Python 时,其实并不是被语法难倒的,而是被“安装环境、配置编辑器、跑通第一个程序”这一连串琐碎操作劝退的。这篇教程不绕弯子,直接给一条从零基础到能写代码实战的完整路径,覆盖 Python 解释器安装、开发工具配置…

作者头像 李华
网站建设 2026/8/30 3:55:50

GT911驱动开发实战:I2C电容触摸从裸机到Linux完整实践

简介:本资源是一份面向嵌入式开发工程师与单片机初学者的GT911电容触摸屏I2C驱动实现,专为解决STM32等MCU平台快速接入GT911触摸控制器的底层通信与坐标解析问题而设计。驱动基于标准I2C协议,完成初始化、寄存器读写、中断响应及多点触摸数据…

作者头像 李华
网站建设 2026/8/30 3:55:01

树莓派+传感器:列车靶场自动音乐播放系统设计与实现

1. 这篇文章真正要解决的问题先解释一下“列车靶场”。它不是一个射击场,也不是什么军事设施,而是我自己的一个模型列车测试场地:一段铺设好的轨道沙盘,用来调试列车模型的运行速度、停车精度、自动调度逻辑。之所以叫“靶场”&am…

作者头像 李华