Wix V4自定义操作条件问题:仅卸载执行,更新时不触发
如何让Wix自定义操作仅在主动卸载时执行,升级时不触发
问题背景
需要让自定义操作DOSTUFF仅在用户通过控制面板「应用和功能」主动卸载产品时执行,版本升级(如1.0.0→1.0.1)时不触发。当前已定义UpgradeVersion检测旧版本,但原条件(REMOVE="ALL") And (NOT PREVIOUSFOUND)在升级时仍会触发操作,添加PREVIOUSFOUND的Secure属性也无效。
核心原因
原条件失效的关键在于:升级时旧产品的卸载会话中并不存在PREVIOUSFOUND属性——这个属性是新产品安装时检测到旧版本才会设置的,旧产品自身卸载时无法读取到该值,导致NOT PREVIOUSFOUND始终为真,结合REMOVE="ALL"就触发了操作。
解决方案
改用Windows Installer原生提供的UPGRADINGPRODUCTCODE属性来区分场景:该属性仅在旧产品被新版本升级卸载时会被自动设置(值为新产品的ProductCode),用户主动卸载时此属性不存在。
修正后的自定义操作条件如下:
<Custom Action="DOSTUFF" Before="RemoveFiles" Condition='REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE'/>
条件说明
REMOVE="ALL":确保当前是完全卸载流程(排除修改、修复等其他安装动作)NOT UPGRADINGPRODUCTCODE:排除旧产品被升级卸载的场景,仅保留用户主动触发的卸载操作
你的UpgradeVersion定义无需修改,保持原样即可:
<UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND" Minimum="1.0.0" IncludeMinimum="yes" Maximum="$(var.Version)" IncludeMaximum="no"/>
内容的提问来源于stack exchange,提问作者aiGreek
相关产品推荐
相关产品推荐

