![为什么不能在 Windows 中一次卸载多个程序?](https://linux22.com/image/1401987/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E8%83%BD%E5%9C%A8%20Windows%20%E4%B8%AD%E4%B8%80%E6%AC%A1%E5%8D%B8%E8%BD%BD%E5%A4%9A%E4%B8%AA%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
为什么 Windows 不允许您一次卸载或删除多个程序?这背后的原因是什么?这会弄乱内部系统吗?
我并不是在寻找如何一次卸载多个程序,我只是在寻找为什么它不是一个选项的原因。
答案1
如果您阅读过有关 Windows 安装程序系统如何工作的任何内容,那么很明显他们将事务数据库的一些想法应用于程序安装和维护,更不用说文件.msi
本身就是数据库。
在设计任何数据库时,总会有一个问题 - 您想要速度还是准确性/安全性?鉴于安装程序可以修改系统配置,并且意外情况可能会导致系统无法运行,因此安全性优先于速度。.msi
安装程序如此缓慢的原因之一是,每个文件等都会生成回滚文件,然后进行修改,之后再删除 - 如果中间出现问题(例如断电或系统崩溃),则可以“回滚”任何更改。
现在,我相信 MSI 引擎本身强制一次只安装、修改或删除一个程序 -.msi
例如,如果您尝试在卸载另一个程序时运行一个程序,它要么不会运行,要么会等待当前正在运行的卸载程序完成。非 MSI 安装程序可能不会这样运行 - 因为它们不使用 MSI 引擎。但由于这个安全设计决策,这可能是appwiz.cpl
坚持只允许一次调用一个卸载程序的原因。
CCleaner 允许您启动卸载程序,而无需等待之前运行的卸载程序完成。由于上述原因,MSI 安装程序可能仍无法并行工作。
答案2
这只适用于使用Windows 安装程序系统。
如果程序使用其自己的(卸载)安装程序系统,那么没有什么可以阻止您同时运行另一个卸载程序。
Windows Installer 限制实例的数量,以避免多个程序在更改系统范围(通常是共享的)设置和文件时产生冲突。
大多数卸载程序都会跟踪它们所做的更改,以便在出现故障时成功回滚。如果一个人不知道(其他卸载程序)所做的所有更改,那么如果它试图回滚失败的安装,那么实际上可能会让事情变得更糟。
Windows Installer 系统的创建目的是成为所有应用程序开发人员使用的统一系统(在 Windows 上),以帮助避免此类问题。
答案3
卸载任务经常会修改多个程序共享的文件或系统文件\注册表(这也是需要管理员权限才能执行此操作的部分原因)。如果同时运行多个卸载任务,它们可能会发生冲突。如果您曾经遇到过“DLL Hell”,情况也是如此。其他程序或 Windows 本身可能会处于不一致的状态。
答案4
同时卸载程序除了存在上述潜在问题外,几乎没有什么好处:它不会比按顺序卸载程序快多少。卸载程序是一项涉及磁盘 IO 的任务。运行多个执行 IO 的程序并不比按顺序运行它们快(除非程序安装在两个单独的物理磁盘上)。事实上,它可能会更慢因为两个竞争的 I/O 任务会降低磁盘缓存的效率,并且磁盘的物理磁头必须从一个地方跳到另一个地方。