MSI升级时如何将安装路径固定到ProgramFiles(x86)?
以下是针对该问题的具体操作步骤:
启用大版本升级逻辑
把新版本MSI配置为大版本升级:在MSI的Upgrade表中,填入旧版本的UpgradeCode、版本范围,将Attributes列设置为包含msiUpgradeAttributesMigrateFeatures和msiUpgradeAttributesRemoveExistingProducts。这种升级模式会先完全卸载旧版本,再安装新版本,从根源上避免旧路径属性被继承。强制重置安装路径属性
在MSI的Property表中,将INSTALLDIR(或你自定义的路径属性)的默认值设为ProgramFilesFolder(对应ProgramFiles(x86),x64包则用ProgramFiles64Folder)。同时添加一个自定义操作,在升级序列的CostInitialize步骤前执行,强制覆盖路径设置,比如用VBScript实现:Session.Property("INSTALLDIR") = Session.Property("ProgramFilesFolder") & "你的产品目录\"给这个自定义操作设置条件
UPGRADINGPRODUCTCODE,确保仅在升级场景触发。清理旧版本Active Setup注册表残留
旧版本的Active Setup会在HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components(或HKCU对应位置)留下指向AppData路径的注册表项。在新版本MSI中添加删除操作:- 在
Registry表中新增条目,Root设为2(HKLM),Key填SOFTWARE\Microsoft\Active Setup\Installed Components\[旧版本Active Setup的GUID],Name留空,Action设为6(删除整个键),条件设为UPGRADINGPRODUCTCODE。 - 如果新版本仍需Active Setup,在
Registry表中添加新的Active Setup条目,将StubPath指向ProgramFiles(x86)下的正确路径。
- 在
清除旧版本的安装路径注册表记录
旧版本可能在HKLM\SOFTWARE\[你的厂商名]\[产品名]或HKCU对应位置留下InstallLocation类的注册表项。在新版本MSI的Registry表中添加删除操作,清除这些旧项,防止安装程序读取旧路径。调整升级执行顺序
检查MSI的InstallExecuteSequence表,确保RemoveExistingProducts动作的执行顺序在InstallInitialize之前。这种顺序能保证旧版本完全卸载后,新版本的路径设置才会生效,不会被旧数据干扰。
内容的提问来源于stack exchange,提问作者Swapnil P

