【问题标题】:How do I force file to be always overridden?如何强制文件始终被覆盖?
【发布时间】:2016-05-17 16:13:57
【问题描述】:

与新版本的相同文件相比,旧版本安装程序中的一个文件似乎具有更新的修改日期,因此在安装我们安装程序的新版本后,该文件消失了。

我将 .aip 更改为“始终覆盖现有文件”,但这不起作用。我试图在安装新版本之前删除该文件并且它工作正常,所以看起来“总是覆盖现有文件”没有任何效果。

我错过了什么吗?如何确保始终覆盖该文件?

更新 1。

我检查的其他事项:

  • 在旧版安装程序的组件属性中未设置“永不覆盖”属性。
  • 尝试将我的自定义操作(运行文件)移动到完成对话框阶段 - 相同的行为。
  • 尝试在运行新版本的安装程序之前手动删除文件 - 行为也相同,但在日志中仅显示 'MSI (s) (C4:40) [16:01:58:046]: 验证文件的可访问性: b.bat' 步骤丢失。

【问题讨论】:

    标签: windows-installer custom-action advanced-installer


    【解决方案1】:

    Windows 安装程序中没有任何东西可以做到这一点。我的意思是组件或文件表中没有具有此功能的位。所以我怀疑 AI 可能在使用“版本谎言”技巧并说文件具有最大可能版本(即使它是数据文件),这样它就会覆盖系统上已经存在的文件。无论哪种方式,Windows 都不会替换已修改的文件(谁想销毁用户数据?),因此您需要明确删除它是有意义的。

    【讨论】:

    • 我认为我会明确删除该文件方法,但我只是设法确认 - 它不起作用。
    【解决方案2】:

    您能否检查一下旧安装版本中的文件组件是否设置了“永不覆盖”属性?如果是这种情况,那么在升级安装期间您的旧文件将被保留(将跳过较新的文件安装),但由于 Windows Installer 错误,旧文件将在旧版本卸载期间被删除(在 RemoveExistingProducts 操作中执行)。

    如果是这种情况,那么(如果可能)您应该从旧文件组件中删除 Never Overwrite 属性。

    【讨论】:

    • 感谢您的回答,但不幸的是,这不是我的情况。
    【解决方案3】:

    好主意,但是如果您将文件组件 GUID 设置为始终随每次构建而更改呢?在 wix 中,您将设置 Guid="*"。这样您就不会被 MSI 的组件/文件版本规则所困。虽然非正统,但我认为这会在每次升级时覆盖文件。

    【讨论】:

      【解决方案4】:

      我也遇到了你上面提到的同样的问题,我用棘手的方式解决了它。希望对你有帮助。

      1. 重命名新版本文件并创建新的 msi 安装程序。我在我的问题中将其重命名为 Jitsi2.exe
      2. 因此,重命名后,它将安装在您的新更新中。
      3. 现在,在您的 msi 文件中添加一个批处理文件,其中包含删除旧文件的命令并再次将 Jitsi2.exe 重命名为其原始名称。
      4. 您必须在安装完成时调用此批处理文件。在高级安装程序中,您可以在安装完成时执行一些操作,这就是调用该批处理文件的时间。(注意:当我调用此批处理文件时,它会进入某种 CMD 循环。所以我将此批处理文件转换为 exe 文件使用免费的开源 bat to exe 转换器软件,现在可以正常工作了)

      【讨论】:

        猜你喜欢
        • 2017-04-06
        • 1970-01-01
        • 2012-11-16
        • 2017-12-30
        相关资源
        最近更新 更多