![](/img/trans.png)
[英]How do I set the MSI exit-code to 0 if product is already installed using WiX?
[英]WIX MSI: I Want to show a message to user "Product is already Installed" if user runs the installer again
我正在创建一个 MSI 安装程序,在测试过程中,如果我第一次运行安装程序,安装程序按预期工作。 但是当我不小心运行安装程序时,它卸载了我的文件。
因此,为此,我修改了条件并在操作条件中添加了 Remove="All"。
哪个工作正常,但我想向用户显示产品已安装的消息。
因此,为此,我添加了以下代码:
<Upgrade Id='<<Upgrade Code>>'>
<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='[ProductName] is already installed.' />
.....
.....
.....
.....
.....
<InstallExecuteSequence>
<Custom Action='AlreadyUpdated' After='FindRelatedProducts'>SELFFOUND</Custom>
</InstallExecuteSequence>
但是当运行这个时,安装程序仍然在第二次运行并且没有给出消息。
在检查日志时,可以看到“FindRelatedProducts”跳过了以下消息:
MSI (c) (F4:1C) [06:18:04:806]: Doing action: FindRelatedProducts
MSI (c) (F4:1C) [06:18:04:806]: Note: 1: 2205 2: 3: ActionText
Action 6:18:04: FindRelatedProducts. Searching for related applications
Action start 6:18:04: FindRelatedProducts.
MSI (c) (F4:1C) [06:18:04:806]: Skipping FindRelatedProducts action: not run in maintenance mode
Action ended 6:18:04: FindRelatedProducts. Return value 0.
和
MSI (s) (18:14) [06:18:05:500]: Running ExecuteSequence
MSI (s) (18:14) [06:18:05:500]: Doing action: FindRelatedProducts
MSI (s) (18:14) [06:18:05:500]: Note: 1: 2205 2: 3: ActionText
Action 6:18:05: FindRelatedProducts. Searching for related applications
Action start 6:18:05: FindRelatedProducts.
MSI (s) (18:14) [06:18:05:507]: Skipping FindRelatedProducts action: already done on client side
Action ended 6:18:05: FindRelatedProducts. Return value 0.
AlreadyUpdated 自定义操作中的条件也不满足。
MSI (s) (18:14) [06:18:05:737]: Doing action: PublishProduct
MSI (s) (18:14) [06:18:05:737]: Note: 1: 2205 2: 3: ActionText
Action 6:18:05: PublishProduct. Publishing product information
Action start 6:18:05: PublishProduct.
PublishProduct:
MSI (s) (18:14) [06:18:05:752]: Re-publishing product - installing new package with existing product code.
Action ended 6:18:05: PublishProduct. Return value 1.
MSI (s) (18:14) [06:18:05:752]: Skipping action: AlreadyUpdated (condition is false)
有什么办法可以达到这个要求吗? 难道我做错了什么?
自定义操作复杂性:首先介绍自定义操作及其复杂性。 请阅读此处的第一段: 为什么在我的 WiX/MSI 设置中限制使用自定义操作是个好主意?
错误的调节:这基本上意味着您的条件不正确,因此自定义操作在它们不应该的安装模式下运行。 当您尝试使用复杂条件(或任何与此相关的条件)时,您应该测试多种安装模式: 1. fresh install
2. repair
3. modify
4. self-repair
5. patching
6. uninstall
7. major upgrade invoked uninstall
等...
在您的情况下,一些自定义操作在维护运行以及全新/首次安装期间运行。 这是一个很常见的问题。 解决方案要么通过改进设置来消除自定义操作,要么改进条件,使它们在任何安装模式下都能实际工作。 明显地。
条件调试:条件很难做到正确。 我喜欢使用消息框测试它们。 此处的底部显示了如何执行此操作: 如何仅在安装和修改时执行有条件的自定义操作? - 然后在不同模式下运行安装程序并查找对话框。 当它们出现时,自定义操作的条件为真。
复杂条件:这是关于为什么旧的自定义操作用于新设置的答案: Wix 工具更新使用旧的自定义操作。
意外的行为:在属性的特殊音符UPGRADINGPRODUCTCODE
和WIX_UPGRADE_DETECTED
。 请阅读: 仅在卸载期间而不是在主要升级期间运行 Wix 自定义操作- 这些怪癖会影响自定义操作在主要升级方案期间运行的次数。 这里有一些非常令人惊讶的效果。 用你的消息框调试?
链接:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.