如何在每次启动时检测已安装的产品版本?

2023-12-11

这个问题,其实是为了避免一个我不会解决的问题

当我安装一次产品并再次使用 MSI 时,会执行卸载过程。 但是,这并不能清除注册表中的残留信息,必须使用“Windows Installer Clean Up”进行清理,并且重新安装时会出现注册表权限问题。

我看到了检查老歌,但是发现FindRelatedProducts只在第一次安装时执行,即当我再次安装MSI时,FindRelatedProducts没有执行。

<Upgrade Id='YOURGUID-7349-453F-94F6-BCB5110BA4FD'>
<UpgradeVersion OnlyDetect='yes' Property='SELFFOUND'
    Minimum='1.0.1' IncludeMinimum='yes'
    Maximum='1.0.1' IncludeMaximum='yes' />
<UpgradeVersion OnlyDetect='yes' Property='NEWERFOUND'
    Minimum='1.0.1' IncludeMinimum='no' />
</Upgrade>

<CustomAction Id='AlreadyUpdated' Error='Foobar 1.0 has already been updated to 1.0.1 or newer.' />
<InstallExecuteSequence>
    <Custom Action='AlreadyUpdated'     After='FindRelatedProducts'>SELFFOUND</Custom>
    <Custom Action='NoDowngrade' After='FindRelatedProducts'>NEWERFOUND</Custom>
</InstallExecuteSequence>

所以想请教一下大家 安装后每次运行 MSI 时如何检查?是否已安装且版本相同,如果已安装相同版本,则退出安装过程。


当您再次运行“相同”的 MSI 时,它会进入维护模式,通常只是修复。 Windows 甚至不需要使用您用于此“安装”的 MSI,因为它使用原始 MSI 进行安装,该安装可能是也可能不是您尝试再次安装的 MSI。因此,不清楚您所说的“卸载过程”是什么意思,也不清楚您期望运行相同的 MSI 实际执行的操作。

FindRelatedProducts 用于重大升级,但这意味着增加 ProductVersion 并更改 ProductCode。运行相同的 MSI 不会导致主要升级(请参阅 WiX MajorUpgrade 元素)。

那么,当您再次运行相同的 MSI 时,您预计会发生什么?您似乎没有卸载它,因此它将使用原始 MSI 文件进入维护模式,因此您无法更改该行为,因为它嵌入在已安装产品的 MSI 中。由于您显然没有卸载已安装的产品,因此它不会删除其注册表项。如果事实上该产品没有被卸载,您应该说明这些残留注册表项是什么以及为什么它们是残留的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在每次启动时检测已安装的产品版本? 的相关文章

  • 如何使用 WiX 设置服务的恢复选项?

    我有以下 wxs 文件
  • 无法使用 WiX 安装程序创建注册表项值

    以下组件按预期执行所有操作 但无法写入最后一个注册表项值 我没有收到任何错误
  • 使用自定义操作卸载多个产品

    我正在为我们的产品开发基于 WIX 的安装程序 该产品有一个基础产品和许多插件 基础版和插件将作为单独的 MSI 提供 仅当底座可用时才能安装插件 基础和插件在根文件夹下共享公共文件夹树 例如 C Program files MyProdu
  • ClickOnce 有哪些替代方案? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我用过单击一次 https en wikipedia org wiki ClickOnce多年来 我经历
  • MSI 安装程序自定义操作身份问题

    我正在创建一个在数据库上执行脚本的自定义操作 问题是 connectios 使用集成安全性 因此当我尝试打开连接时出现错误 用户 Domain ComputerName 登录失败 当我检查自定义操作的身份时 使用System Securit
  • 如何确定现有应用程序的安装范围?

    我有一个基于的安装程序WixUI Advanced允许用户选择安装范围 每个用户或机器范围 升级时 安装了较低版本的现有应用程序 我想隐藏安装范围屏幕并自动选择他们上次选择的安装范围 如何判断先前安装使用的安装范围 Edit 查看我的 MS
  • 我应该如何处理 WiX 安装程序中的产品升级?

    我有一个相当大的 WiX 安装程序 250 Mb 以上 我正在尝试制定合适的升级策略 安装程序中的大多数文件都不会更改 并且当只有一两个文件发生更改时 我们不希望分发整个包 我研究了主要和次要升级 我的理解是 如果产品 ID 发生变化 只要
  • WiX 在构建服务器上失败

    我有一个使用 WiX 的项目 它在我的本地计算机上运行良好 但是当我发布到构建服务器时 构建会因以下内容而崩溃 来自 MSBuild 日志 Using HeatDirectory task from assembly C Program F
  • 如何编写自定义操作 DLL 以在 MSI 中使用?

    这是我打算自己回答的问题 但请随意添加其他方法来完成此任务 我正在打包一个应用程序以用于各种配置 并且我确定在 MSI 中执行自定义逻辑的最可靠方法是编写我自己的自定义操作 DLL 该 DLL 能够从 PROPERTY 表中读取 写入 终止
  • 当自动为 WIX 安装程序收集文件时,我的目录结构有多灵活?

    请原谅我的无知 我一直在阅读一些书 但还没有准备好尝试任何东西 目前 我们有一个 wxs 文件 该文件无法轻松维护 每当从 SVN 提交 删除新文件时 都会手动添加 删除所有文件 由于在创建新文件和更新 wxs 安装文件之间发生了失误 我们
  • 如何使用自定义操作在 WiX 中运行脚本 - 最简单的示例?

    WiX新手问题 我该怎么办1 将一次性 shell 脚本与安装程序一起复制到 temp e g
  • Windows 安装程序和安装应用程序合并到一个文件中?

    我使用 Visual Studio 在 C 中编写了一个应用程序 我创建了一个项目设置文件 该文件在我的调试中为我创建了文件 Windows Installer 和安装应用程序都是必需的 但我想将它们合并为一个 就像当您下载应用程序时 安装
  • 使用 WiX 将程序集放入 GAC 和安装路径中

    我刚刚开始学习如何使用 WiX 但遇到了障碍 我的软件包使用第三方库 该库要求 GAC 和软件包安装目录中都存在一些文件 使用 WiX 我可以使文件显示在安装目录或 GAC 中 但不能同时显示在两者中 有什么办法可以解决这个问题吗 这里有一
  • WIX MSI 软件包卸载

    我正在使用 WIX 作为安装程序包 当我通过双击原始 msi 包卸载该包时 一切都很好 当我从控制面板卸载时 它会给我一个最小的用户界面卸载 我已在 MSI 中写入一个自定义操作 询问用户是否要卸载某些数据库等 最小 UI 卸载时不会发生这
  • 用于配置编辑的 wix 自定义对话框

    你好 我正在尝试使用 wix v3 为我的应用程序设置 msi 我对这项任务有疑问 我需要一个用户输入 该输入将存储在我的应用程序的配置文件中 例如 我需要一个用于 sql 连接字符串的对话框 并且用户输入将写入应用程序配置文件中 我尝试用
  • WIX 自动生成 GUID *?

    假设我生成产品 ID 为 的 WIX XML 文件 另外 对于每个组件 GUID 我都使用
  • 如何制作一个简单包装 EXE 文件的 MSI

    经过大量实验后 我得出的结论是 Windows Installer 是一种糟糕的技术 但客户需要 MSI 文件 那么 如何创建一个 MSI 文件 将 EXE 文件提取到临时目录 并使用与传递给 EXE 文件相同或相似的选项运行它 MSI 的
  • Wix - 自定义安装目录

    我使用的是 Wix 3 x 用户应该能够选择目标目录 我的Setup wxs目前是这样的 http pastebin com uH1EjbDQ http pastebin com uH1EjbDQ 询问用户自定义目标目录的最简单方法是什么
  • 如何使用 WiX 卸载时终止进程

    我正在使用 Wix 创建 msi 安装文件 当我卸载应用程序时 它仍然在工作 并且我可以在任务管理器中看到它 我已经尝试过自定义操作的延迟执行 如 Wix 文档中所述 https wixtoolset org documentation m
  • 执行卸载之前停止 Windows 服务

    我有一个安装程序 它安装了一些组件 包括 Windows 服务 安装后它将启动使用 CustomAction 安装到系统上的服务 当我卸载应用程序时出现问题 安装程序要求先关闭应用程序 然后再继续 我创建了一个将停止服务的自定义操作 并通过

随机推荐

  • 是否可以在网络共享上的 NuGet 本地源中同时托管常规包和符号包?

    首先 我对 NuGet 还很陌生 我在工作中开发了许多内部 C 桌面应用程序 它们之间共享一些通用代码 我一直在从使用项目引用切换到创建私有 NuGet 包并将它们托管在共享网络文件夹中的本地源中 我只接触了几天 但到目前为止 我已经成功地
  • Hive/Hadoop 间歇性故障:无法将源移动到目标

    已经有一些关于Hive Hadoop 无法移动源 错误 其中许多都指向许可问题 然而 在我的网站上我看到了同样的错误 但我很确定它与权限问题无关 这是因为该问题是间歇性的 一天有效 但另一天失败 因此 我更深入地研究了错误消息 它抱怨未能从
  • 在 Visual Studio 中设置嵌入互操作类型 true 和 false 有什么区别?

    在 Visual Studio 中 向项目添加一个引用时 属性窗口有一个选项Embed Inteop Types 我们应该将其设置为True or False 有什么不同 由于我们有很多项目 其中一些项目被设置为参考False 其他人被设置
  • 如何在 C# 中读取 msExchMailboxSecurityDescriptor 属性

    我正在尝试读取 AD 中的所有用户属性 如何阅读msExchMailboxSecurityDescriptorC 中的属性 我使用了以下代码 但出现了强制转换错误 欢迎大家提出意见 DirectoryObjectSecurity oSec
  • 本地构建 jekyll 站点并将其推送到 github 页面

    我在我的网站上使用 gem jekyll assets 但在推送到 github 页面时失败 我读过 解决这个问题的方法是在本地构建网站 构建得很好 然后将其推送到 github 页面 然而 人们这样做的例子是使用项目存储库 并将站点推送到
  • 重定向附加到同一日志文件的标准和错误输出

    我需要将多个进程的标准输出和错误日志收集到一个日志文件中 所以每个输出都必须append到此日志文件 我想用这样的行调用所有作业 p start process myjob bat redirectstandardoutput logfil
  • 使用google plus API是否可以获取gmail联系人

    在我的应用程序中 我想获取我的 Gmail 联系人 在我的应用程序中我已经集成了 Google API 所以我只需要知道我可以使用相同的 API 访问我的 Gmail 联系人吗 或者我需要集成 Gmail API 请帮助我 我对此很陌生 我
  • 在 GitHub 存储库中创建标签

    我在 GitHub 中有一个存储库 我需要tag it 我在 shell 中标记了 但是在GitHub 它没有显示 我还需要做其他事情吗 我在shell中使用的命令是 git tag 2 0 现在当我打字时git tag表明 2 0 所以看
  • panda的多索引有什么好处?

    所以我了解到我可以使用 DataFrame groupby 而无需使用 MultiIndex 来进行子采样 横截面 另一方面 当我在 DataFrame 上有 MultiIndex 时 我仍然需要使用 DataFrame groupby 进
  • 在 vue.js 中安装 vuetify 后,新项目无法编译

    我在 vue js 中遇到问题 我使用 webstorm 创建了一个新项目 它运行完全没有问题 我可以看到 vue 徽标 在下一步中 我想安装 vuetify 但出现如下错误 编译失败 src plugins vuetify js 找不到模
  • Java:为什么需要初始化原始局部变量?

    public class Foo public static void main String args float f System out println f print 语句会导致以下编译时错误 局部变量 f 可能尚未初始化 如果 J
  • G++ 未定义参考 std::

    我一直致力于将我的一款游戏移植到 Linux 但似乎无法找出收到错误的原因 该游戏最初是在 Visual Studio 2010 中编写的 我已经提取了所有需要的内容 标题 cpp 纹理 并正在尝试编译 使用编译文件g c o exampl
  • Android:显示SD卡中的图像

    这让我发疯 这是我的代码 我知道这个文件存在 File imageFile new File sdcard gallery photo 4 jpg ImageView jpgView ImageView findViewById R id
  • 无法在 Windows 上的 Qt Creator 中选择 GDB

    我在 Windows 上的 Qt Creator 中选择了 GDB 而不是 CDB 作为调试器 但是当我开始调试程序时 它失败并出现以下错误 Unable to create a debugger engine of the type No
  • 关键问题的 Datastax 不匹配

    我们当前的设置包含具有 3 节点集群的 DSE 5 0 2 版本 当前我们面临重负载和节点故障问题 Debug log 详细信息如下 DEBUG ReadRepairStage 8 2016 09 27 14 11 58 781 ReadC
  • uilocalnotification 没有在准确的时间触发

    我想实施uilocalnotification在我的应用程序中 但问题是它没有在准确的时间发射 它在给定发射时间后 30 40 秒后发射 有什么我想念的或者这是一个常见的想法UILocalNotification Thanks UILoca
  • 为 jQuery 地图突出显示启用单击突出显示

    我正在使用 jQuery 高亮插件制作图表 http davidlynch org js maphilight docs 我目前有一个可单击的图表 并根据您单击的区域 如简单的选项卡 加载内容 但是 我需要地图在单击时突出显示并禁用任何其他
  • 将选项卡放在右侧的 Shiny tabsetPanel 中

    默认情况下 选项卡位于tabsetPanel被放在左边 是否可以在右侧放置一个选项卡 同时在左侧保留其他选项卡 所以看起来像这样 library shiny ui lt fluidPage tabsetPanel tabPanel tab
  • JavaFX 2 中的 GroupBox / TitledBorder?

    有没有类似的东西GroupBox or 标题顺序在 JavaFX 2 上可用吗 感谢您的任何提示 除非您需要此答案中的自定义样式 否则我更喜欢TitledPane with setCollapsible false Andriy Kryvt
  • 如何在每次启动时检测已安装的产品版本?

    这个问题 其实是为了避免一个我不会解决的问题 当我安装一次产品并再次使用 MSI 时 会执行卸载过程 但是 这并不能清除注册表中的残留信息 必须使用 Windows Installer Clean Up 进行清理 并且重新安装时会出现注册表