为什么不能在 Windows 中一次卸载多个程序?

Jer*_*oen 99 windows uninstall windows-7

为什么 Windows 不允许您一次卸载或删除多个程序?这背后的原因是什么?它会搞乱内部系统吗?

我不是在寻找如何一次卸载多个程序,我只是在寻找它不是一种选择的原因。

Law*_*ceC 101

如果您阅读了有关 Windows 安装程序系统如何工作的任何内容,很明显他们将事务数据库中的一些想法应用于程序安装和维护,更不用说.msi文件本身就是一个数据库。

在设计任何数据库时总是有一个问题——你想要速度还是准确性/安全性?鉴于安装人员可以修改系统配置,并且事故可能导致系统无法运行,因此安全优先于速度。.msi安装程序如此缓慢的原因之一是因为为每个文件等制作了回滚文件,这些文件将被修改,然后被删除 - 如果中间出现问题,允许“回滚”任何更改(例如停电或系统崩溃)。

现在,我相信 MSI 引擎本身一次只强制安装、修改或删除一个程序 -.msi例如,如果您尝试运行另一个程序正在卸载,它要么不会运行,要么将等待当前正在运行的卸载完成。非 MSI 安装程序可能不会以这种方式运行 - 因为他们不使用 MSI 引擎。但由于这个安全设计决定,这可能就是为什么appwiz.cpl坚持只让一次卸载程序被调用的原因。

CCleaner 允许您启动卸载程序,而无需等待之前运行的卸载程序完成。由于上述原因,MSI 安装程序可能仍无法并行工作。

  • 需要注意的一件事是,类 Unix 系统上的包管理器也不会出于几乎相同的原因尝试一次删除多个包。如果您删除多个包,它们会一个接一个地删除,可能每个都在自己的事务中。 (29认同)
  • @Joey 这是真的,但您至少可以指示 *nix 包管理器这样做,他们会计算出顺序。我认为更大的问题是 Windows 不理解包管理级别的依赖概念。 (4认同)
  • @tudor:我认为这只是在不同操作系统上管理应用程序的方式不同。Windows 管理*应用程序*,而在类 Unix 上的包管理器管理,嗯,*包*,可以是库、应用程序和类似的东西。Windows *可以*管理这些事情(它确实在内部这样做,例如当您启用或禁用 Windows 组件时),但是在 90 年代后期在系统范围内拥有 3rd 方库并没有那么好,因此鼓励应用程序只是捆绑他们所有的依赖项。 (4认同)

Ƭᴇc*_*007 19

这仅适用于使用Windows Installer系统的程序

如果一个程序使用它们自己的(卸载)安装程序系统,那么没有什么可以阻止您同时运行另一个卸载程序。

Windows Installer 限制实例数量,以避免多个程序在更改系统范围(通常共享)设置和文件时发生冲突。

大多数卸载程序会跟踪他们正在更改的内容,以便在出现故障时可以成功回滚。如果人们不知道(由其他卸载程序)所做的所有更改,那么如果它尝试回滚失败的安装,实际上可能会使事情变得更糟。

创建 Windows Installer 系统的目的是成为所有应用程序开发人员(在 Windows 上)使用的统一系统,以帮助避免此类问题。


K.A*_*ica 9

卸载任务经常修改由多个程序共享的文件,或系统文件\注册表(需要管理权限来执行此操作的部分原因)。如果同时运行多个卸载任务,它们可能会发生冲突。如果您曾经遇到过“DLL 地狱”,那也是一样的。其他程序或 Windows 本身可能会处于不一致的状态。