InstallShield LE:MSI升级时如何避免覆盖配置文件
嘿,我刚好熟悉InstallShield Limited Edition(也就是你用的VS2013配套版)的这个痛点——它确实比完整版少了不少直观的选项,但咱们还是有靠谱的方法搞定升级时保留配置文件的需求,一步步来:
解决InstallShield LE升级时保留配置文件的方案
方法1:用内置的文件替换规则(最稳妥,不用写代码)
这是MSI本身的机制,也是最不容易出错的方式:
- 首先,确保你的配置文件没有设置文件版本(如果已经加了版本号,后续升级时千万别更新这个版本号)。MSI的默认逻辑是:如果目标机器上的文件版本更高,或者没有版本,就不会覆盖它。
- 打开InstallShield的「Files and Folders」视图,找到你的配置文件:
- 右键点击配置文件所属的组件(划重点,是组件,不是单个文件),选择「Properties」。
- 在组件属性窗口的「File Installation Behavior」区域,选择「Only overwrite if the file is older」——这个选项LE版本里肯定有。
- 再切到「Advanced」标签页,勾选「Never Overwrite」属性,这会进一步确保现有文件不会被替换。
方法2:给组件加安装条件(进阶版)
如果上面的方法还不够保险,咱们可以让配置文件只在全新安装时部署,升级时直接跳过:
- 同样找到配置文件的组件,进入「Advanced」标签页,勾选「Permanent」(这个属性LE里藏在这里)。
- 然后切到「Conditions」标签页,添加条件字符串:
NOT UPGRADINGPRODUCTCODE。
解释一下:MSI在升级时会自动把UPGRADINGPRODUCTCODE设为True,所以这个条件意思是「只有不是升级的时候才安装这个组件」——升级时组件不安装,自然不会覆盖现有配置。
方法3:自定义操作的正确打开方式(如果前面的方法不适用)
如果你之前尝试自定义操作出错,大概率是时机或者脚本逻辑没搞对。这里给你一个靠谱的VBScript方案:
- 先写个脚本文件
PreserveConfig.vbs,内容如下:
Dim objFSO, sourceConfig, tempConfig Set objFSO = CreateObject("Scripting.FileSystemObject") ' 获取安装目录,用MSI的内置属性INSTALLDIR sourceConfig = Session.Property("INSTALLDIR") & "YourConfigFile.exe.config" tempConfig = Session.Property("INSTALLDIR") & "YourConfigFile.exe.config.bak" ' 升级前备份现有配置 If objFSO.FileExists(sourceConfig) Then objFSO.CopyFile sourceConfig, tempConfig, True End If ' 安装完成后恢复配置 Sub RestoreConfig() If objFSO.FileExists(tempConfig) Then objFSO.CopyFile tempConfig, sourceConfig, True objFSO.DeleteFile tempConfig, True End If End Sub
- 把这个脚本添加到InstallShield的「Custom Actions」视图:
- 加一个「Before Install」的自定义操作,执行备份逻辑(或者直接在脚本里通过判断阶段处理)。
- 再加一个「After Install」的自定义操作,执行
RestoreConfig子程序。 - 记得给这两个自定义操作设置执行条件:
UPGRADINGPRODUCTCODE——只有升级时才跑这个逻辑。
重要提醒
- 一定要把配置文件放在独立的组件里,别和服务的可执行文件混在一起!不然组件的替换规则会影响所有文件,反而搞砸。
- 测试的时候一定要走真实流程:装旧版本→改配置→装新版本,确认配置确实保留了。
内容的提问来源于stack exchange,提问作者Inayat
相关产品推荐
相关产品推荐

