工具
- NIS Edit v2.0.3
- NSIS v3.03
思路:
脚本向导+修改代码=个性化安装包
-
步骤:
1.安装上面两款软件,启动NIS Edit,在“文件”菜单中“新建脚本:向导”->下一步”,如图1:
2.设置应用程序信息,如软件名称、版本、出版人等,如图2。如果设置了应用程序网站,则安装包会生成一个对应网址的“Internet 快捷方式”。
3.设置程序选项,如安装包图标、安装程序文件、安装包语言[这里选“SimChinese”]、用户图形界面及压缩方式等,选用默认值,也可以点击对应项目的按钮或下拉菜单更改设置,如下图3
4.设置安装目录及授权信息,如图4后“下一步”:
5.选定程序文件,即我们要打包的文件,可以使用默认的“Mainsection”,也可以根据需要进行更改或新建组别,如果组比较多时,可以设置是否“允许用户选择要安装的组件”,如图5
6.完毕后进行“添加文件”操作,选定我们要打包的文件,如图6,完成自动后返回的图5的界面,执行下一步操作。
7.设置开始菜单中文件夹名称及快捷方式,这里我们使用默认值,如图7,按“下一步”:
8.指定安装后要运行的程序,同上用默认值并设置相关运行参数及描述,不想在安装运行任何程序,则留空即可,如图8
9.这步是有关卸载程序的相关信息,如卸载时的提示、卸载的图标等,如图9
10.勾选“保存脚本”、“转换文件路径到相关路径”及“编译脚本”,如图10
问题解决方案
1.用NSIS做安装程序,在卸载信息提示部分出现乱码方案一
使用Notepad++编写脚本,编码格式使用ANSI方案二
编码格式使用UTF-8(有BOM),在脚本最前面加上Unicode true
2.使用相对路径
Var PROJECT_PATH
Section “MainSection” SEC01
;获取 $INSTDIR 的上一级目录
GetFullPathName $0 ../../../
DetailPrint PROJECT_PATH
SetOutPath “$INSTDIR”
File “${PRODUCT_DIR_ROOT_NAME}\CapClient.bat”
SectionEnd
3.打包文件移除不需要的文件
移除掉Bin/Interpreter目录下的Linux,Unix目录
File /r /x “Linux” /x “Unix” “${PRODUCT_DIR_ROOT_NAME}\Bin*”
4.卸载程序检查当前程序是否在运行
下载FindProcDLL
放到C:\Program Files (x86)\NSIS\Plugins(软件的安装目录)里面
Function .onInit
FindProcDLL::FindProc “xxx.exe”
Pop $R0
IntCmp $R0 1 0 no_run
MessageBox MB_ICONSTOP “安装程序检测到 ${PRODUCT_NAME} 正在运行,请关闭之后再卸载!”
Quit
no_run:
FunctionEnd
5.检测程序多次安装,通过注册表的方式
Function .onInit
ClearErrors
ReadRegStr $UNINSTALL_PROG ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} “UninstallString”
IfErrors done
ReadRegStr $OLD_VER ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} “DisplayVersion”
MessageBox MB_ICONSTOP “检测到本机已经安装了 ${PRODUCT_NAME},请卸载后再安装”
Quit
done:
FunctionEnd
6.解决win7卸载程序快捷方式卸载不彻底
创建快捷方式时
RequestExecutionLevel user
Section -AdditionalIcons
SetShellVarContext all
CreateShortCut “$SMPROGRAMS\Capsheaf\Website.lnk” “$INSTDIR\${PRODUCT_NAME}.url”
CreateShortCut “$SMPROGRAMS\Capsheaf\Uninstall.lnk” “$INSTDIR\uninst.exe”
SectionEnd
删除快捷方式时
RequestExecutionLevel admin
Section Uninstall
SetShellVarContext all
Delete “$SMPROGRAMS\Capsheaf\Uninstall.lnk”
Delete “$SMPROGRAMS\Capsheaf\Capsheaf.lnk”
SectionEnd