使用NSIS创建安装程序:基础指南

4星 · 超过85%的资源 需积分: 48 46 下载量 144 浏览量 更新于2024-09-14 收藏 31KB TXT 举报
"这篇文档介绍了NSIS(Nullsoft Scriptable Install System)的基础知识,包括它的作用、特点和脚本编写。NSIS是一个用于创建安装程序的工具,它能完成复制文件、修改注册表、创建快捷方式等自动化安装任务。NSIS的脚本语言简单易学,且具有高度灵活性,通过编译后生成的可执行文件小巧,只添加了34KB的代码。脚本文件是文本格式,可以使用任何文本编辑器编写,推荐使用支持行号和语法高亮的编辑器。脚本中,每行被视为一个命令,可以使用反斜杠进行换行。此外,文档还提到了如何处理字符串中的双引号问题。" NSIS(Nullsoft Scriptable Install System)是一个开源的安装包制作工具,开发者可以通过编写脚本来实现各种安装过程,从简单的文件复制到复杂的系统配置。NSIS的脚本语言设计简洁,允许开发者创建包含多种功能的安装程序,如写入注册表、设置环境变量、在线更新等。NSIS的一大优势在于其生成的安装程序紧凑,自身代码占用小,使得最终的可执行文件体积减至最小。 在NSIS脚本编写中,每个命令通常占据一行,如果行过长,可以使用反斜杠进行续行,编译器会将它们视为一行处理。字符串处理中,双引号需要转义,可以使用$\"或选择其他不会引起混淆的引号。脚本文件通常以扩展名`.nsi`编写,推荐使用支持行号和语法高亮的编辑器以提高编写效率。 创建安装程序的过程中,主要涉及以下步骤: 1. **定义输出文件**:通过`OutFile`命令指定生成的安装程序文件名。 2. **定义安装过程**:通过`Section`和`SectionEnd`定义安装过程中的各个部分,每个部分可以包含一系列的命令,如复制文件、创建快捷方式等。 3. **创建安装页面**:使用`Page`或`PageEx`命令创建安装向导中的不同页面,如许可协议页、组件选择页、目标目录选择页等。 4. **定义卸载过程**:同样使用`Section`和`SectionEnd`定义卸载过程,以创建卸载程序。 例如,以下脚本创建了一个名为"MyProgram"的安装部分,将"MyProgram.exe"和"Readme.txt"两个文件复制到安装目录: ```nsis Section "MyProgram" SetOutPath $INSTDIR File "MyProgram.exe" File "Readme.txt" SectionEnd ``` 这里,`SetOutPath $INSTDIR`设置输出路径为安装目录,`File`命令用于添加需要复制的文件。 NSIS提供了一种强大且灵活的方式来创建自定义的安装程序,使得开发者能够控制安装过程的每一个细节,满足各种软件部署的需求。通过熟练掌握NSIS脚本,开发者可以创建出用户体验良好、功能完备的安装程序。
2019-04-22 上传
一.环境变量配置 ; 定义系统环境变量的 注册表key值 !define WriteEnvStr_RegKey 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' ;设置环境变量 Function "regExpandStr" SetOverwrite ifnewer ;设置jdk环境变量 WriteRegExpandStr ${WriteEnvStr_RegKey} "JAVA_HOME" "$INSTDIR\jdk1.8.0_131" ;设置CATALINA_DIR WriteRegExpandStr ${WriteEnvStr_RegKey} "CATALINA_DIR" "$INSTDIR\tomcat\bin" ;设置CATA_LINA WriteRegExpandStr ${WriteEnvStr_RegKey} "CATA_LINA" "$INSTDIR\tomcat" ;设置path ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$0;C:\windows\system32;$INSTDIR\redis;$INSTDIR\mysql\bin;$INSTDIR\Java\jdk1.8.0_131\bin;" #第一次是使环境变量修改对其他进程有效;刷新环境变量 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 SetOverwrite on functionend ;注册服务 Function "installService" detailprint "------------------------------------install tomcat Service..." Sleep 2000 SetOutPath "$INSTDIR\tomcat\bin" nsExec::Exec 'cmd /c service install' nsExec::Exec 'cmd /c sc config tomcat8 start= auto' ;设置服务自动开启 detailprint "------------------------------------install tomcat Service success..." detailprint "install mysql Service..." Sleep 2000 SetOutPath "$INSTDIR\mysql\bin" nsExec::Exec 'cmd /c $INSTDIR\mysql\bin\mysqld.exe" -install Mysql --defaults-file="$INSTDIR\\mysql\\my.ini' detailprint "install mysql Service success..." detailprint "------------------------------------install redis Service..." Sleep 2000 SetOutPath "$INSTDIR\redis" nsExec::Exec 'cmd /c redis-server --service-install redis.windows.conf' detailprint "install redis Service success..." functionend ; 启动服务 Function "startService" detailprint "------------------------------------start tomcat..." nsExec::Exec 'cmd /c sc start Tomcat8' detailprint "------------------------------------start tomcat success..." detailprint "------------------------------------start mysql..." nsExec::Exec 'cmd /c sc start mysql' detailprint "------------------------------------start MySQL success..." detailprint "------------------------------------start redis..." ;nsExec::Exec 'cmd /c sc redis-server --service-start --service-name redis' detailprint "------------------------------------start redis success..." functionend ;停止服务 Function "un.stopService" detailprint "正在停止tomcat服务......." nsExec::Exec 'cmd /c sc stop tomcat8' detailprint "停止tomcat服务成功......." detailprint "正在停止mysql服务......." nsExec::Exec 'cmd /c sc stop mysql' detailprint "停止mysql服务成功......." detailprint "正在停止redis服务......." nsExec::Exec 'cmd /c sc redis-server --service-stop --service-name redis' detailprint "停止redis服务成功......." functionend ;删除服务 Function "un.uninstService" detailprint "正在卸载tomcat服务......." nsExec::Exec 'cmd /c sc delete tomcat8' detailprint "卸载tomcat服务成功......." detailprint "正在卸载mysql服务......." nsExec::Exec 'cmd /c sc delete mysql' detailprint "卸载mysql服务成功......." detailprint "正在卸载redis服务......." nsExec::Exec 'cmd /c sc delete redis' detailprint "卸载redis服务成功......." functionend ;清空环境变量 Function "un.emptyRegExpandStr" #删除 系统环境变量JAVA_HOME 和 CATALINA_HOME #卸载的时候必须设置JAVA_HOME 和 CATALINA_HOME两个环境系统变量为空,或者删除这两个系统变量。否则会出现NSIS选择系统变量的错误(NSIS会自动选择之前有值的系统变量,而不是选择当前刚设置的系统变量) detailprint "正在删除相关环境变量......." functionend 二.校验mac地址 #序列号 校验页面 Page custom check_serial_number Var "MacAddress" Function check_serial_number Call .GetMacAddress #MessageBox MB_OK '当前机器Mac地址为:$MacAddress' ${if} $MacAddress == '00-50-56-C0-00-08' ${OrIf} $MacAddress == '00-50-56-C0-00-081' #MessageBox MB_OK '已授权' ${Else} MessageBox MB_OK '未授权,请联系经销商并授权!' ;SendMessage $HWNDPARENT 0x408 3 0 #页面跳转 Call onClickClose ${EndIf} FunctionEnd #获取主机MAC地址 Function .GetMacAddress System::Call Iphlpapi::GetAdaptersInfo(i,*i.r0) System::Alloc $0 Pop $1 System::Call Iphlpapi::GetAdaptersInfo(ir1r2,*ir0)i.r0 StrCmp $0 0 0 finish loop: StrCmp $2 0 finish System::Call '*$2(i.r2,i,&t260;.s,&t132;.s,i.r5)i.r0' ;Unicode版将t改为m IntOp $3 403 + $5 StrCpy $6 "" ${For} $4 404 $3 IntOp $7 $0 + $4 System::Call '*$7(&i1;.r7)' IntFmt $7 "X" $7 StrCpy $6 "$6$7" StrCmp $4 $3 +2 StrCpy $6 "$6-" ${Next} StrCpy $MacAddress $6 Goto loop finish: System::Free $1 FunctionEnd 三.关闭按钮功能 ;点击右上角关闭按钮 Function onClickClose FindProcDLL::FindProc "${PRODUCT_NAME}.exe" Sleep 500 Pop $R0 ${If} $R0 != 0 KillProcDLL::KillProc "${PRODUCT_NAME}.exe" ${EndIf} FunctionEnd