如何为NSIS设置策略处理目标目录中安装包未包含的文件?
问题陈述
假设有如下文件夹层级结构:
rootlibsmodelsclassesimages
该层级结构存在于已安装的程序目录和用于更新该现有程序的新版NSIS安装包中。
NSIS会替换层级结构内所有已变更的文件,例如:若安装目录的root\models下有模型文件a.stl和b.stl,安装包的root\models下也包含这两个文件,则二者都会被更新。
但如果安装目录下存在a.stl和b.stl,而安装包中仅包含c.stl,那么运行安装程序后,安装目录的root\models下会同时存在a.stl、b.stl和c.stl,尽管前两者可能已经过时。
问题
是否可以为NSIS设置策略,以处理目标目录层级中存在但安装包未包含的文件?
当然可以通过Delete或RMDir命令实现,但我想知道是否必须这么做,或者是否存在指定该行为的标志。
本质上我在寻找类似SetOverwrite的功能,但针对目录?
NSIS本身没有类似SetOverwrite、可直接配置处理目录中多余文件的内置标志或开关,必须通过脚本命令手动处理这类场景。
如果要清除目标目录中安装包未包含的文件,常见的实现思路有两种:
- 预清理目标目录:在安装新文件前,先删除目标目录下的所有内容(注意保留用户自定义配置等需要留存的文件),再写入安装包内的文件。比如针对
root\models目录,可以执行:
之后再正常安装RMDir /r "$INSTDIR\root\models" MkDir "$INSTDIR\root\models"c.stl。这种方式简单直接,但要注意避免误删用户需要保留的数据。 - 对比清理:先枚举目标目录下的所有文件,再和安装包内的文件列表对比,删除不在安装包内的文件。这种方式更精细,但需要编写额外的脚本逻辑来实现文件枚举和对比,比如使用
FindFirst/FindNext命令遍历目录,再通过自定义的文件列表进行校验。
如果你的场景中存在需要保留的用户文件,建议先将这些文件备份,清理完成后再恢复,避免数据丢失。
内容的提问来源于stack exchange,提问作者Koenigsberg
相关产品推荐
相关产品推荐

