Windows\Installer 文件夹清理。清理标记为已取代的 msp 和 msi 补丁

Windows\Installer 文件夹清理。清理标记为已取代的 msp 和 msi 补丁

有人尝试过这个脚本吗?

https://forums.mydigitallife.net/threads/presenting%E2%80%A6-startcomponentcleanup-for-msi- including-office.77708/

它清理了我的 windows\installer 目录中大约 6Gb 的文件,其中大部分是旧的 Office 2016 补丁。

清理安装程序目录中旧的和标记为取代的 msp 和 msi 补丁有什么缺点吗?

答案1

好吧,我在一台装有 Win7 和 Office 2010 的旧办公室电脑上进行了实验。这个脚本的主要缺点是运行时间:虽然这台 (i3) 电脑有 SSD,但运行时间还是略长于两个小时。删除所有中间 Office 补丁后,磁盘空间节省了约 9GB……但脚本在临时文件中创建了 20GB 的日志,因此如果空间不足,这个脚本就不太实用了。(我也将脚本输出到日志中:它删除了大约 700 个补丁。)

我注意到没有不良影响:如果在运行脚本后检查更新,则不会提供新的更新,因此它不会删除任何重要内容,并且 Office 仍可运行并可提供服务(添加/删除组件有效)。


有点理论性的答案:如果 MSP 设计精良,运行该脚本就不会造成任何破坏,除非您稍后卸载补丁(手动或某些自动化过程执行),在这种情况下您会发现补丁是否设计精良。

作为Heath(MSFT)解释道,如果您删除被取代的补丁,那么如果“顶级补丁”也被手动删除,那么您将得到比您预期的更旧(且有缺陷)的应用程序版本。我的想法是,结合某些被取代的软件包可能无法卸载/“永久”的特性,可能会破坏某些应用程序;跳过两段以了解可能发生这种情况的详细信息。(permanent是关键字.mum在文件中使用

但在我们进入该场景之前,让我先澄清一些事情(这是了解发生了什么的好方法):被取代的补丁虽然仍然存在于注册表中(这就是该脚本找到它们的方式),但根本不会显示在已安装的更新中(至少在 Win 7 上),除非它们也没有被标记为不可卸载/。(我自己测试了这一点,通过修改该脚本以不删除任何内容,而只是列出它会做什么,然后在控制面板中检查补丁。)但如果你卸载了一个顶级补丁,导致被取代但可卸载的补丁变得无法分散,当你刷新它时,它会重新弹出到控制面板列表中。(一些第三方 wix 工具集的编写者发现这种行为相当令人困惑

另外,删除被取代的补丁不应与msizap g删除目录中存在但注册表中根本没有引用的孤立补丁。后者是有时也是必要的,当一些应用程序“垃圾”补丁时,它们甚至根本没有注册(VS 2005 显然以此而闻名。)

但实际上,有一种方法可以通过卸载中间/被取代的补丁来破坏设计不良的补丁程序:假设您有文件 A 和 B,最初都是 1.0 版。补丁 X 将文件 A 置于版本 1.1,这与 1.0 版的文件 B 兼容。然后补丁 Y 将文件 B 置于版本 1.1,这也与 1.1 版的 A 兼容,但与 1.0 版的 A 不兼容。但不知何故,这个补丁 Y 被设置为不可卸载,这实际上可能发生在有很多方法之后,您有了补丁 Z,它将文件 A 和 B 置于 1.2 版本。然后有人运行脚本,卸载补丁 X(已被取代),但无法卸载 Y(已被取代但无法卸载)。然后他们手动回滚补丁 Z,留下暴露的文件 A 版本 1.0 和 B 版本 1.1(来自补丁 Y)。这会破坏应用程序。

诚然,这种情况可能不会发生在 MSFT 应用程序中,因为 MSFT 会提供最新的 MSP(补丁)列表,这些补丁可以自行安全安装,即无需安装所有祖先 MSP。MS 就是这样做的例如 Office 2016,但不适用于 2010(尽管他们甚至费心制作了 2010 的即点即用版本)。从我对脚本的快速检查来看,Silverlight 提供了(大量)不可卸载(脚本称它们为“永久”)但被取代的补丁,因此即使在 MS 领域也存在这样的事情。实际上 Office 2010 也有一些,例如:

Microsoft Office Proof (Chinese (Traditional)) 2010 : Security Update for Microsoft Office 2010 (KB2760781) 64-Bit Edition is a permanent patch, run this script with /f to uninstall it

Adobe Acrobat Reader DC 的行为也与 Silverlight 非常相似,具有大量不可卸载和被取代的补丁。


另外值得注意的是,Vista 时代的一份相当古老的 MS 文档删除被取代的内容%windir%\Installer安全移除 SxS 的先决条件(这是另一个膨胀的原因):

安全减小 WinSxS 文件夹大小的唯一方法是减少系统可以执行的操作集 - 最简单的方法是首先删除安装组件的软件包。这可以通过以下方式完成卸载系统上被取代的软件包版本。Service Pack 1 包含一个名为 VSP1CLN.EXE 的二进制文件,该工具将使 Service Pack 包永久(不可移动)在您的系统上,并删除所有被取代组件的 RTM 版本。这只能做到,因为通过使 Service Pack 永久化,我们可以保证我们永远不需要 RTM 版本。

因此,删除被取代的内容%windir%\Installer也应该有助于减少 SxS 大小。请注意,有半自动化的方法可以完成后者(我怀疑,在某个被取代的补丁确实被卸载后,使用 API,而不是简单的删除):

  • 在 Win 7 SP1 中,大约在 2013 年引入了一种方法kb2852386它添加了一个新的磁盘清理(应用程序)插件。但是它本身不会卸载任何与应用程序相关的 MSP %windir%\Installer,我已经测试过了。此插件将其行为记录在 中%SystemRoot%\Logs\CBS\DeepClean.log。在那里你可以看到类似以下内容的内容:
Package_for_RollupFix~31bf3856ad364e35~amd64~~7601.23642.1.0 superseded - uninstalled
2020-07-03 06:47:01, Info                  CBS    
  • 在 Win 10 中 dism /Cleanup-Image /StartComponentCleanup /ResetBase根据其文档,它似乎将所有未被取代的补丁变成不可卸载的“服务包”。事实上,后者的文档表明它也可能卸载一些被取代的补丁,但我还没有真正测试过它的作用。MS 声称:

Windows 10 和 Windows Server 2016 使用与本主题中描述的方法类似的方法自动减小 WinSxS 文件夹的大小,此外内部流程,例如卸载和删除已被其他较新版本的组件替换的组件包。某些组件的先前版本会在系统中保留一段时间,以便您在必要时进行回滚。一段时间后,这些较旧的组件将自动从安装中删除。[...]

在正在运行的 Windows 10 版本上使用 Dism.exe 的 /StartComponentCleanup 参数会得到与在任务计划程序中运行 StartComponentCleanup 任务类似的结果,但更新组件的先前版本将被立即删除(没有 30 天的宽限期)并且您将没有 1 小时的超时限制。[...]

在正在运行的 Windows 10 版本上将 /ResetBase 开关与 DISM.exe 的 /StartComponentCleanup 参数结合使用将删除组件存储中每个组件的所有取代版本。[...] 此命令完成后,无法卸载所有现有服务包和更新。这不会阻止卸载未来的服务包或更新。

也有点意思,在同一个 MDL 论坛上的其他人为 Win 7 编写了 /ResetBase 等效项。我还没有测试过。后一种 hack 看起来比 OP 提到的简单脚本要复杂得多。它还“附带”了dismcore.dll来自(现在)旧版 Win 7 的全套 dll 等,所以我怀疑它是否能与后来的服务堆栈很好地配合使用。

相关内容