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


99

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

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


9
为了防止人们一次卸载所有内容……也许。
M.Bennett 2014年

@ M.Bennett我也在想,但是无法选择多个程序,因此用户无论如何也无法真正卸载所有程序。
Jeroen Bollen 2014年

5
实际上,您可以一次删除多个程序,它是阻止您卸载多个程序的唯一Windows Installer,这是因为它仅允许其自身的一个实例。删除程序文件非常容易,如果需要,您可以删除程序文件的所有内容,这将无法有效卸载这些程序。
Ramhound 2014年

@Ramhound:您似乎是这里唯一正确理解询问者意图的人:他希望系统 顺序卸载程序。这里的回答者对他的问题有不同的理解:是否可以同时卸载多个程序。不用说,在Linux中很容易做到:您只需键入apt-get -y uninstall prog1 prog2 prog3
Niccolo M. 2014年

4
@NiccoloM我的问题实际上是为什么您不能同时进行。:P
Jeroen Bollen 2014年

Answers:


101

如果您了解Windows安装程序系统的工作原理,那么很明显,他们将事务数据库中的一些想法应用到了程序的安装和维护中,更不用说.msi文件本身就是数据库了。

设计任何数据库时始终存在问题-您想要速度还是准确性/安全性?鉴于安装人员可以修改系统配置,并且事故可能会使系统无法运行,因此安全性已被赋予优先于速度的要求。.msi安装程序之所以如此缓慢的原因之一是,为每个文件等创建了回滚文件,这些文件将被修改,然后被删除-允许在发生中间错误的情况下“回滚”任何更改(例如停电或系统崩溃)。

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

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


29
需要注意的一件事是,类似Unix的系统上的软件包管理器也不会出于几乎相同的原因立即尝试删除多个软件包。如果删除多个软件包,则它们将一个接一个地删除,可能每个都在各自的事务中删除。
2014年

+1好极了!要注意的一件事。如果文件夹中有一堆独立的可执行文件(例如CPU-Z),则可以一次将其全部卸载(删除)。
MonkeyZeus 2014年

4
@Joey的确如此,但是您至少可以指示* nix程序包管理器执行此操作,然后他们会确定顺序。我认为更大的问题是Windows在软件包管理级别上不了解依赖项的概念。
tudor

4
@tudor:我认为这是在不同操作系统上管理应用程序的方式的不同。Windows管理应用程序,而在类Unix上,程序包管理器很好地管理程序包,可以是库,应用程序或类似的东西。Windows 可以管理这些事情(可以肯定是在内部执行的,例如,当您启用或禁用Windows组件时),但是在整个系统范围内拥有第三方库在90年代后期的表现并不理想,因此鼓励应用程序捆绑他们所有的依赖。
2014年

@Joey我同意你的观点,但是在这样一个开放的共享空间中,指责用户(或开发人员)并不会太过分。用户仅看到应用程序,但应用程序只是软件包的一部分。甚至需要管理多个库,即使它们具有不同的版本和供应商。恕我直言,要求开发人员对其进行管理最多是乐观的,结果造成了沉重的负担。Windows应用商店对此有所帮助,但与自动依赖项解析相比还有很长的路要走,这使得* nixes在这方面变得更加简单。
tudor 2014年

19

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

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

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

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

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


9

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


这就是正确答案的大部分内容。如果程序“ A”安装了非核心Windows DLL“ X”,则程序“ B”在其安装程序中需要它,那么它也可能是卸载程序的一部分。但是卸载DLL“ X”会破坏程序“ A”。因此,如果应该删除共享DLL和其他文件,卸载程序通常会询问有关共享DLL和其他文件的信息。如果同时运行,这种提示将无法正常工作。最后,也许更重要的是,每个人都忘记了Windows注册表-Windows注册表核心组件,它经常在安装程序/卸载程序中更新。
Darrell Teague 2014年

-1

同时卸载程序,除了有其他潜在的问题外,几乎没有好处:不会比顺序卸载程序快得多。取消安装程序是一项涉及磁盘IO的任务。运行多个执行IO的程序并不比顺序运行它们快(除非将程序安装在两个单独的物理磁盘上)。实际上,它可能会变慢,因为两个相互竞争的IO任务将使磁盘缓存效率降低,并且磁盘的物理磁头将不得不从一个地方跳到另一个地方。


这与答案无关。如果您一次执行太多操作,则涉及磁盘I / O的所有操作都有可能减慢速度,但是Windows真正阻止您执行的唯一操作是同时(卸载)安装。并且有充分的理由希望能够同时进行(卸载)安装-用户能够排队进行一系列操作并使它们全部一起运行将变得更加容易,而无需坐下来等待每个依次完成。此外,SSD不再存在争用问题。
Andrew Medico 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.