生而自由

自由而无用的灵魂

NSIS脚本基础Demo

NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序。它提供了安装、卸载、系统设置、文件解压缩等功能。如其名字所指出的那样,NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的。NSIS 的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序这类应用所设计的。

NSIS应该是Windows下使用最为广泛的安装程序制作工具了,可以说长成下面这样的安装程序基本就可以判断是用NSIS制作的了。Electron生成的安装包也是基于NSIS生成的,用NSIS制作的也可以用WinRAR 好压等压缩软件直接打开来查看其中的文件。

《NSIS脚本基础Demo》

如果在NSIS脚本中声明了强制压缩,那么在启动安装程序时还会先进行解压操作,就像下图这样,本文中提供的Demo脚本中也强制启用了压缩。

《NSIS脚本基础Demo》

好记心不如烂笔头,最后在这里记录一个包含常用基础功能的NSIS脚本Demo,Demo不一定能直接跑起来,但都有注释,也蛮容易看懂的。安装NSIS,写完脚本后,和安装文件丢在一起,右键“Compile NSIS Script”就能生成安装包了。另外注意这里用了unicode,脚本本身的编码格式需要是“UCS-2 Little Endian格式”。

;强制压缩
SetCompressor /SOLID LZMA
SetCompress force

;基本定义
!define PRODUCT_NAME "TestApp"
!define PRODUCT_VERSION "1.0.0"
!define PRODUCT_COMPANY "Test Company"

;文件属性
VIProductVersion "${PRODUCT_VERSION}"
VIAddVersionKey FileDescription "${PRODUCT_NAME} Installer"
VIAddVersionKey FileVersion "${PRODUCT_VERSION}"
VIAddVersionKey ProductName "${PRODUCT_NAME} Installer" 
VIAddVersionKey ProductVersion "${PRODUCT_VERSION}"
VIAddVersionKey CompanyName "${PRODUCT_COMPANY}"
VIAddVersionKey LegalCopyright "Copyright (C) 2015-2020 ${PRODUCT_COMPANY}"

;使用现代外观
;--------------------------------
;Include Modern UI

  !include "MUI2.nsh"

;输出文件名,默认安装目录,是否要求管理员权限运行
;--------------------------------
;General

  ;Properly display all languages (Installer will not work on Windows 95, 98 or ME!)
  Unicode true

  ;Name and file
  Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
  OutFile "TestInstaller v${PRODUCT_VERSION}.exe"

  ;Default installation folder
  InstallDir "$PROGRAMFILES\TestCompany\TestApp"
  
  ;Get installation folder from registry if available
  ;InstallDirRegKey HKCU "Software\Modern UI Test" ""

  ;Request Admin privileges for Windows Vista
  RequestExecutionLevel admin
  
;--------------------------------
;Variables

;--------------------------------
;Interface Settings

  !define MUI_ABORTWARNING
  
  ;Show all languages, despite user's codepage
  !define MUI_LANGDLL_ALLLANGUAGES

; 页面设置,可指定安装完成后运行xxx;
;--------------------------------
;Pages

  !insertmacro MUI_PAGE_WELCOME
  ;!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
  
  !define MUI_FINISHPAGE_RUN "$INSTDIR\Test.exe"
  !insertmacro MUI_PAGE_FINISH
  
  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_INSTFILES
  

; 多语言  
;--------------------------------
;Languages
 
  !insertmacro MUI_LANGUAGE "SimpChinese"
  !insertmacro MUI_LANGUAGE "English"
  
;--------------------------------
;Reserve Files
  
  ;If you are using solid compression, files that are required before
  ;the actual installation should be stored first in the data block,
  ;because this will make your installer start faster.
  
  !insertmacro MUI_RESERVEFILE_LANGDLL

; "Section"定义,可以理解为实际的安装过程
;--------------------------------
;Installer Sections
Section "!Test" SecTest

  SectionIn RO

  SetOutPath "$INSTDIR"
  
  ; 拷贝文件和文件夹
  ;ADD YOUR OWN FILES HERE...
  File /r "main"
  
  File msvcp120.dll
  File msvcr120.dll
  File Updater.exe
  
  ;执行命令
  Exec '"$INSTDIR\Updater.exe" -deleteservice'
  
  ;写注册表,自启动
  ;Regedit
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Run" "${PRODUCT_REG_AUTORUN_KEY}" '"$INSTDIR\${PRODUCT_NAME}.exe" /min'
  
  ;删注册表
  ;Clean the previous uninstall information
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${XXXX}"
  
  ;写注册表,可以在控制面板中添加卸载项
  ;Add uninstall information
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "DisplayName" "${PRODUCT_NAME}"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "Publisher" "${PRODUCT_COMPANY}"
  
  ;桌面图标
  ;shortcut
  SetShellVarContext all
  CreateShortCut "$DESKTOP\Test.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"

  ;生成卸载程序
  ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"

SectionEnd

;安装/卸载程序启动时的执行的“函数”,这里FindProcDLL是需要另外安装的NSIS插件
;--------------------------------
;Installer Functions
;安装程序启动时执行的函数
Function .onInit

  FindProcDLL::FindProc "Test.exe"
  IntCmp $R0 1 0 TestNotRunning
    MessageBox MB_OK|MB_ICONEXCLAMATION "Please close Test first" /SD IDOK
    Abort
  TestNotRunning:

  !insertmacro MUI_LANGDLL_DISPLAY

FunctionEnd

;卸载程序启动时执行的函数
Function un.onInit
FunctionEnd

;多国语言文案
;--------------------------------
;Descriptions

  ;Language strings
  LangString DESC_SecTest ${LANG_SIMPCHINESE} "Test主程序"
  LangString DESC_SecTest ${LANG_ENGLISH} "Test main program"

  ;Assign language strings to sections
  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
    !insertmacro MUI_DESCRIPTION_TEXT ${SecTest} $(DESC_SecTest)
  !insertmacro MUI_FUNCTION_DESCRIPTION_END

;卸载“section”的实现
;--------------------------------
;Uninstaller Section
Section "Uninstall"
  ;uninstall Service
  Exec '"$INSTDIR\Test.exe" -uninstall'

  ;删除文件
  ;ADD YOUR OWN FILES HERE...
  RMDir /r "$INSTDIR\main"
  
  Delete "$INSTDIR\msvcp120.dll"
  Delete "$INSTDIR\msvcr120.dll"
  
  ;删除注册表
  ;Clean AutoRun
  DeleteRegValue HKLM "Software\Microsoft\Windows\CurrentVersion\Run\" "${PRODUCT_REG_AUTORUN_KEY}"
  
  ;删除卸载项
  ;Clean uninstall information
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
  
  ;删除桌面快捷方式
  SetShellVarContext all
  Delete "$DESKTOP\Test.lnk"

  ;删除卸载程序本身
  Delete "$INSTDIR\Uninstall.exe"

  RMDir "$INSTDIR"

SectionEnd

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

code