【问题标题】:Msiexec REINSTALL=ALL REINSTALLMODE=vamus not reinstalling anythingMsiexec REINSTALL=ALL REINSTALLMODE=vamus 不重新安装任何东西
【发布时间】:2009-02-12 21:49:40
【问题描述】:

基本上我正在尝试升级我的应用程序,据我了解,以下内容应该无条件地重新安装所有组件: msiexec /i myapp.msi REINSTALL=ALL REINSTALLMODE=vamus

但是我在详细日志中看到: MSI (s) (A0:60) [15:40:10:948]:组件:A;安装:本地;请求:空;行动:空

MSI (s) (A0:60) [15:40:10:948]:组件:B;安装:本地;请求:空;行动:空

MSI (s) (A0:60) [15:40:10:948]:组件:C;安装:本地;请求:空;行动:空

MSI (s) (A0:60) [15:40:10:948]:组件:D;安装:本地;请求:空;行动:空

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

有人对可能出现的问题有任何见解吗?

编辑:安装程序是在 WiX 中创建的。产品 ID 和 UpgradeCode 保持不变,而 PackageID 设置为 * 所以应该为每个构建生成一个新的,所以据我所知应该是正确的

【问题讨论】:

    标签: windows-installer


    【解决方案1】:

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

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

    如果仍然无法正常工作,您必须选择新安装,并且必须自己弄清楚需要更新的内容。

    或者,您可以进行重大更新,在卸载后进行安装。 Windows 安装程序不关心这种方式的功能组件结构。

    【讨论】:

    • 如果是这种情况,我可能不得不对所有内容进行重大更新......我们需要升级和降级的能力,所以虽然保留空组件并不理想,但它是仍然可行,但我们无法为将来需要的组件预先创建组件
    【解决方案2】:

    Windows 安装程序会主动阻止将二进制文件降级到难以完成的程度,即使像使用 REINSTALLMODE=amus 那样使用“绝对强制”也是如此。这是微软防止 Windows 早期存在的“DLL 地狱”战略的一部分。在那些日子里,可以用旧版本覆盖系统 DLL 文件,从而破坏左右和任何地方的东西。 Windows Installer 具有多层保护,可防止二进制文件降级。

    如果您需要能够像您提到的那样降级文件,唯一真正有效的方法是使用重大升级。与卸载和重新安装相关产品相比,重大升级并不是真正的升级。这使您可以避免使 MSI 次要升级正常工作所涉及的许多复杂性。

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

    %ProgramFiles%\我的公司\我的产品\1 %ProgramFiles%\我的公司\我的产品\1.1

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 不检查版本号,因为我们实际上需要允许升级和降级。
      【解决方案4】:

      我遇到了同样的问题。

      对我有用的是完全删除 REINSTALL=ALL REINSTALLMODE=vamus

      我认为主要问题是重新安装模式下的 v 选项,根据下面链接上的文档,“不要使用 v 重新安装选项代码来首次安装应用程序或功能”,我是在旧版本之上安装我的产品的新版本。

      https://msdn.microsoft.com/en-us/library/windows/desktop/aa371182(v=vs.85).aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-26
        • 2020-11-05
        • 2017-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-29
        • 1970-01-01
        相关资源
        最近更新 更多