Windows installer Msiexec REINSTALL=ALL REINSTALLMODE=vamus不重新安装任何东西

Windows installer Msiexec REINSTALL=ALL REINSTALLMODE=vamus不重新安装任何东西,windows-installer,Windows Installer,基本上,我正在尝试升级我的应用程序,据我所知,应无条件重新安装以下所有组件: msiexec/i myapp.msi重新安装=所有重新安装模式=vamus 但在详细日志中,我看到: MSI(A0:60)[15:40:10:948]:成分:A;安装:本地;请求:空;操作:空 MSI(A0:60)[15:40:10:948]:成分:B;安装:本地;请求:空;操作:空 MSI(A0:60)[15:40:10:948]:成分:C;安装:本地;请求:空;操作:空 MSI(A0:60)[15:40:10:9

基本上,我正在尝试升级我的应用程序,据我所知,应无条件重新安装以下所有组件: msiexec/i myapp.msi重新安装=所有重新安装模式=vamus

但在详细日志中,我看到: MSI(A0:60)[15:40:10:948]:成分:A;安装:本地;请求:空;操作:空

MSI(A0:60)[15:40:10:948]:成分:B;安装:本地;请求:空;操作:空

MSI(A0:60)[15:40:10:948]:成分:C;安装:本地;请求:空;操作:空

MSI(A0:60)[15:40:10:948]:成分:D;安装:本地;请求:空;操作:空

每个组件的Etc。如果我从目标文件夹中删除或重命名一个文件,它将正确安装新版本,但是如果该文件存在于该位置,它将忽略它,而不是用当前msi文件中的副本替换它

有人对可能出现的问题有什么见解吗


编辑:安装程序是在WiX中创建的。产品ID和升级代码保持不变,而PackageID设置为*,因此应为每个版本生成一个新版本,据我所知,这应该是正确的。

您更新了版本号并配置了升级吗?

这有点棘手,我遇到了相同的问题。 要使更新安装工作正常,更新包必须包含原始包中的所有组件。 这意味着您永远无法删除组件。您可以从组件中删除文件,甚至可以删除所有文件,但不允许删除组件。 否则,在执行修补程序或小更新时,更新安装实际上不会执行任何操作。组件ID存储在Windows注册表中,Windows Installer服务使用它们检查系统上是否安装了组件

如果已删除组件,该怎么办? 您可以尝试重新添加它们,但它们具有相同的包ID,这是困难的,甚至是不可能的部分

如果它仍然不起作用,你必须选择一个新的安装,必须自己弄清楚需要更新什么


或者,您也可以进行一次主要更新,先进行卸载,然后再进行安装。Windows Installer不会以这种方式关注功能组件结构。

Windows Installer将积极防止将二进制文件降级到难以完成的程度,即使在使用“纯强制”时,也会像使用REINSTALLMODE=amus一样。这是微软防止Windows早期存在的“DLL地狱”战略的一部分。在那些日子里,有可能用旧版本覆盖系统DLL文件,从而破坏左、右和所有地方。Windows Installer具有多个保护层以防止降级二进制文件

在您需要能够降级您提到的文件的情况下,唯一真正有效的方法是使用主要升级。主要升级并不是真正的升级,而是卸载和重新安装相关产品。这使您能够避免MSI次要升级正常工作所涉及的许多复杂性

即使在降级方面进行重大升级,也存在复杂性。您必须在InstallExecuteSequence的早期对现有产品的卸载进行排序,以便旧产品在Windows Installer在文件成本计算期间对系统进行过多分析之前从系统中消失。此操作将系统状态与MSI中的文件进行比较,并确定需要(重新)安装的文件。如果版本逻辑指示MSI中的文件是降级文件,最终结果可能是磁盘上的文件被删除,而旧文件根本没有安装。可能需要使用自定义操作提前从磁盘中删除文件,以使降级可靠,或者使用目标目标文件夹的绝对路径在不同版本之间不同的安装文件夹。这将使MSI“文件成本计算”无法看到安装在同一位置的文件:

%ProgramFiles%\My Company\My Product\1 %ProgramFiles%\My Company\My Product\1.1


我不喜欢这个“移动目标”安装文件夹-我认为这不是MSI文件应该安装的方式,但它可以解决您的问题。

我也有同样的问题

对我有效的方法是完全删除重新安装=全部重新安装模式=vamus

我认为主要问题是在重新安装模式下的v选项,正如下面链接上的文档所示,“不要在第一次安装应用程序或功能时使用v重新安装选项代码”,我在旧版本的基础上安装了新版本的产品


如果是这样的话,我可能不得不对所有内容进行重大更新。。。我们需要升级和降级的能力,所以虽然保留空组件并不理想,但仍然可行,但我们不能为将来需要的组件预先创建组件。它没有检查版本号,因为我们实际上需要允许升级和降级。