先说下缘由,我的程序在运行时会在安装目录下生成数个文件,但卸载程序时,会卸载不完全,安装目录及其中的新生成文件会残留。
我用InstallShield 2015 Premier新建工程时选的Basic MSI Project.
如果你新建工程时,选用的InstallScript MSI Project,可参见此文做法:http://www.hiadmin.org/2010/04/13/installshield-deletedir/
我的做法是在程序执行卸载前,用脚本方式将生成的文件夹和文件先删除。再说明一下,我的安装工程用的是在Basic MSI Project选项,下面是操作步骤:
1.进到Behavio and Logic->InstallScript,在Files上点右键,选New Script File,会在Files下生成一个Setup.rul,点Setup.rul可看到脚本内容,并看到已生成一个默认的MyFunction的函数,将此函数更名为你自己的函数名称,如DeleteFiles
2.在函数体加入删除文件或文件夹的代码,如
function DeleteFiles (hMSI)
// To Do: Declare local variables.
begin
DeleteDir (TARGETDIR^"\config",ALLCONTENTS);
DeleteFile(TARGETDIR^"\my.cfg");
end;
3.进到Custom Actions and Sequences,在Custom Actions上点右键,选New InstallScript,会在Custom Actions下面生成NewCustomAction1项, 点击NewCustomAction1, 在Function Name中选DeleteFiles,在 Install Exec Sequence中选After ISUnSelfRegisterFiles
因为是Basic MSI Project工程,无法限定此函数在指定的的UnInstalling事件中执行,所以此函数会在安装时和卸载时执行两次, 所以选择DeleteFiles执行的时机尤为重要,经我验证,选在After ISUnSelfRegisterFiles,不会造成误删文件
也顺便吐槽一下InstallShield
- 选择Basic MSI Project工程却无法在写脚本时关联事件,
- 选择InstallScript Project工程可以关联事件却没了预设的对话框
- 选择 InstallScript MSI Project工程可关联事件,有预设对话框却无法方便的更改对话框的执行顺序。
如果新建的每个工程都可以实现同样的操作,而新建工程时列出的模板只是替用户配置了可操作的选项,工程建立后可随意增加配置或减少配置,这样不是更方便用户使用吗?