# C:\Windows\Installer 文件夹能清理吗

`C:\Windows\Installer` 是 Windows Installer 的缓存，通过 Windows Installer 装上的软件，每个 MSI 安装包和每个 MSP 补丁都在这里留了一份，以后更新、修复或卸载这些软件时，Windows 要用的就是这些副本。微软的说法很简单，这个文件夹不应该删，删坏了当时看不出来，要等到某个软件下次更新或卸载时才出问题，而且微软没有提供任何受支持的清理工具，想安全地拿回空间，要靠卸载不用的软件和别处的清理，不是动这个文件夹。

## 里面放的是什么

[微软关于安装程序缓存的支持文章](https://learn.microsoft.com/en-us/troubleshoot/windows-client/application-management/missing-windows-installer-cache)讲了它为什么存在，用 Windows Installer 安装一个产品时，卸载和更新它所需的重要文件会存进这个缓存。微软安装团队博客上 Heath Stewart 2008 年的[一篇文章](https://devblogs.microsoft.com/setup/why-windows-installer-may-require-so-much-disk-space/)讲得更细，缓存的要么是去掉了内嵌压缩包的 `.msi`，要么是完整的 `.msp` 补丁，之后所有的维护操作都会用到它，包括卸载这个产品，补丁要整份保留，是因为更新过的文件就在补丁里。

所以这个文件夹会跟着打过补丁的 MSI 软件一起变大，每装一个补丁就多一个缓存的 `.msp`，整个文件夹就成了这些软件以后可能还要用的东西的总账，微软的文章里专门点了 SQL Server 和 Office，办公电脑上常见的大头就是它们。

<figure class="blog-diagram">
  <picture>
    <source media="(max-width: 900px)" srcset="/img/blog/windows-windows-installer-folder-cleanup-zh-mobile.webp" type="image/webp" width="768" height="1180">
    <img src="/img/blog/windows-windows-installer-folder-cleanup-zh.webp" width="1360" height="454" loading="lazy" alt="缓存的安装包什么时候被用到">
  </picture>
  <figcaption>安装时把安装包复制进缓存，之后更新、修复和最后的卸载都要再读取它。</figcaption>
</figure>

## 为什么删了以后才出问题

微软的文章明确说，问题可能要等到卸载、修复或更新某个产品时才出现，删掉一个缓存文件当天什么事都没有，几个月后 Office 一次更新失败，或者某个软件卸不掉。同一篇文章列了缓存文件缺失时安装日志里可能出现的错误：

| 代码 | 大意 |
| --- | --- |
| 1612 | 这个产品的安装源不可用 |
| 1620 | 无法打开这个安装包 |
| 1635、1636 | 无法打开这个更新包 |
| 1642 | 无法安装升级，要升级的程序可能不存在 |

这些代码也有别的原因，看到其中一个并不能证明是缓存坏了。真正让删除代价很大的是恢复，微软说这些文件是每台电脑独有的，不能从别的电脑拷过来，Windows 支持人员也没法帮你找回，从备份里只恢复缺的那几个文件也做不到，能选的只有软件厂商自己的修复步骤、系统还原点、完整的系统状态还原，或者重装 Windows 和所有软件。

## 隐藏的 `$PatchCache$` 文件夹

文件夹里还有一个 `$PatchCache$`，叫基线缓存，补丁更新一个产品时，Windows Installer 可以把被替换文件的旧版本存一份，这样以后再打补丁或卸载补丁，就不必去找当初的安装介质。[微软的 MaxPatchCacheSize 说明](https://learn.microsoft.com/en-us/windows/win32/msi/maxpatchcachesize)写了上限，默认最多可以用磁盘的 10%，策略设成 0 以后不再存新文件，而且改策略不会影响已经存下的文件。

那篇 2008 年的安装团队博客说这些基线文件可以删，代价是之后卸载补丁或恢复缺失文件时，可能会要求提供原始安装源，很多几年前下载安装的软件早就找不到安装包了，文章也不建议关掉这份缓存。先用下面的命令量一下，如果它本来就不大，这笔交换不值得做。

## 先量，再决定

下面两条命令只读取大小，用来看整个文件夹和基线缓存各占多少，以管理员身份打开 PowerShell 运行：

```powershell
(Get-ChildItem C:\Windows\Installer -Force -Recurse -File -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum / 1GB
(Get-ChildItem 'C:\Windows\Installer\$PatchCache$' -Force -Recurse -File -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum / 1GB
```

拿结果和整块盘的容量比一比，500 GB 的盘上占几个 GB，是装着打过补丁的软件的正常代价。如果数字特别大，电脑上又装着 Office 或 SQL Server，通常就是它们，该用的也是它们自己的工具。

## 孤立的安装包，只走官方路线

产品卸掉以后残留下来的补丁，常被叫作孤立安装包，很多人找清理工具就是为了它们。微软的文章正面回答过，有些第三方声称能重建或修复安装程序缓存，微软不推荐、也不认可其中任何一家，用了风险自负，微软也没有一个通用工具来判断哪些缓存文件没人用并把它们删掉。

官方有的是按产品来的办法，SQL Server 的话，同一篇文章链接了微软在 SQL Server 更新时恢复缺失缓存文件的步骤，Office 的话，它指向 Robust Office Inventory Scan 和一个补丁维护工具。如果某个产品的更新报了上面那几个错误，先去看这个厂商的修复或卸载说明，而不是先去动文件夹。

## 更安全的拿回空间的办法

- **卸载不用的软件**：在设置 › 应用 › 已安装的应用里，按[微软的卸载步骤](https://support.microsoft.com/en-us/windows/uninstall-or-remove-apps-and-programs-in-windows-4b55f974-2cc6-2d2b-d092-5905080eaf98)来，Windows Installer 本来就是围绕卸载程序设计的，而不是在它背后删文件。
- **用磁盘清理的系统文件类别**：Windows 更新清理和传递优化文件见 [磁盘清理和存储感知怎么选](/zh/windows/blog/disk-cleanup-vs-storage-sense-windows)，组件存储见 [WinSxS 目录清理](/zh/windows/blog/winsxs-folder-cleanup-windows)。
- **看看根目录的大文件**：`hiberfil.sys` 和 `pagefile.sys` 经常各有好几个 GB，取舍见 [C 盘根目录的休眠文件和分页文件](/zh/windows/blog/hiberfil-pagefile-c-drive-windows)。
- **找出真正占满磁盘的东西**：游戏、视频、虚拟磁盘和 Docker 数据更常见，从 [怎样找出占空间的大文件](/zh/windows/blog/find-large-files-on-windows) 开始。

`C:\ProgramData\Package Cache` 也要同样小心，微软的 [Dev Drive 文档](https://learn.microsoft.com/en-us/windows/dev-drive/)把包缓存描述为软件存放更新、卸载和修复所需源文件的地方，并点名 Visual Studio 的大量数据就放在这里。

## 哪些事不要做

不要为了删除去夺取 `C:\Windows\Installer` 的所有权，不要为了让清理数字好看去清空它，也不要从别的电脑拷缓存文件来补缺。除非是受影响产品的厂商自己提供的，不要运行删除“孤立” `.msp` 文件的脚本。

Mole for Windows 不碰这两个文件夹，清理页没有针对 `C:\Windows\Installer` 或 `Package Cache` 的规则，软件页卸载后查找残留时，名叫 Installer 或 Package Cache 的文件夹会被当成 Windows 和所有软件共用的目录，不会算到正在卸载的那个软件名下。

## 常见问题

### Windows Installer 文件夹可以删吗？

不可以，微软说 Windows Installer 缓存不应该删除，用 MSI 安装的软件更新、修复和卸载都要用它，删了以后的问题会晚些才出现。

### C:\Windows\Installer 为什么这么大？

它为每个 MSI 安装包和每个装过的 MSP 补丁都留了一份，所以经常打补丁的软件，比如 Office、SQL Server，会让它越来越大。

### $PatchCache$ 可以删吗？

微软安装团队说过基线缓存文件可以删，但之后卸载补丁或修复文件时可能要找原始安装介质，先量一下它有多大再决定。

### 有没有微软的工具能清理 Windows Installer 文件夹？

没有通用的，微软不认可第三方的缓存清理工具，只给了 SQL Server 和 Office 各自的处理步骤，想省空间就在设置里卸载不用的软件，不要直接改这个文件夹。


Canonical: https://mole.fit/zh/windows/blog/windows-installer-folder-cleanup
