转自:http://blog.csdn.net/lee353086/article/details/45919901

NSIS学习笔记
Date:2015-05-20
Author:kagula
Env:VS2013Update4、nsis-2.46.5-Unicode-setup.exe、CoolSoft_NSISDialogDesigner_1.4.0、eclipse-jee-kepler-SR2-win32、Win7-64bits

设置NSIS环境
Step1:(编译NSIS脚本)

从http://www.scratchpaper.com/网站下载“nsis-2.46.5-Unicode-setup.exe”文件并安装。

Step2:(NSIS脚本语法高亮)
参考资料[3]为Eclipse安装NSIS插件,用来编译NSIS脚本。
[Eclipse main menu]->[Help]->[Install new software...]->type the nsis http address and select component to install.
这里要注意的是
 [1]Eclipse NSIS插件不支持JDK1.8或更高版本。不支持Windows8或更高版本。
 [2]要先建一个空的project,然后通过向导添加NSIS Script会报错。错误信息为空。
 [3]通过向导添加Install Options文件(ini)文件

输出文件名必须为[/"项目名"/"你文件的事名字"]这种形式,否则会报输出文件名非法的提示。

[4]你可能通过outline子窗口,快速定位NSI脚本中的变量与函数。

现在你可以直接把nsi文件拖入Eclipse中编辑了。
最新版本(不稳定版)可以直接从下面网址下载
https://github.com/henrikor2/eclipsensis

Step3:(自定义GUI)
参考资料[1]下载"CoolSoft_NSISDialogDesigner_1.4.0.exe",我们需要这个工具来自定义安装界面。

最简单的流程是
第一步:先在EclipseNSIS(或其它NSIS脚本编辑器)里把脚本写好.
第二步:启动NSIS compiler。[NSIS Menu]->[Compiler]->[compiler NSI scripts]。
第三步:把nsi文件,拖到NSIS compiler里,NSIS compiler会自动编译,setup.exe的生成。

要使用NSIS首先得学会使用它的脚本语言,NSIS脚本的每一行代表命令,源文件扩展名为nsi,头文件扩展名为.nsh。

一个软件可能有很多组件组成,NSIS用section代表每个组件。示例代码如下:
Section "My Program"
  SetOutPath $INSTDIR
  File "My Program.exe"
  File "Readme.txt"
SectionEnd

下面是一个典型的NSIS示例代码,除了自定义页面风格,该有的都有了。

# All the other settings can be tweaked by editing the !defines at the top of this script
!define APPNAME       "比价系统"
!define COMPANYNAME   "浙江天下商邦科技股份有限公司"
!define SETUPFILENAME "setup.exe"
!define DESCRIPTION   ""  !define APPEXENAME    "cat8637_priceComparingSystem.exe"  # These three must be integers
# 这里定义的是安装包的版本,应该和当前主程序(EXE文件)的版本一致
!define VERSIONMAJOR    2
!define VERSIONMINOR    0
!define VERSIONBUILD    0
!define VERSIONREVISION 0  #定义当前软件(EXE文件)的版本
!define VERSIONLONG  "${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONBUILD}.${VERSIONREVISION}"  #安装程序ico文件名和位置
!define ICOFILENAME "cat8637_brand2.ico"
!define ICOFULLPATH "..\PriceComparingSystem\res\${ICOFILENAME}"  # These will be displayed by the "Click here for support information" link in "Add/Remove Programs"
# It is possible to use "mailto:" links in here to open the email client
!define HELPURL   "http://www.8637.com/" # "Support Information" link
!define UPDATEURL "http://www.8637.com/" # "Product Updates" link
!define ABOUTURL  "http://www.8637.com/" # "Publisher" link  # This is the size (in kB) of all the files copied into "Program Files"
# issue 目录的大小
!define INSTALLSIZE 84379885  RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on)  InstallDir "$PROGRAMFILES\${COMPANYNAME}\${APPNAME}"  # rtf or txt file - remember if it is txt, it must be in the DOS text format (\r\n)  #MUI macro define
!define MUI_PAGE_HEADER_TEXT ${COMPANYNAME}
!define MUI_PAGE_HEADER_SUBTEXT '${APPNAME} v${VERSIONLONG}'
!define MUI_ICON ${ICOFULLPATH}  # This will be in the installer/uninstaller's title bar
Name    "${APPNAME}"
Icon    "${ICOFULLPATH}"
outFile "${SETUPFILENAME}"
;BrandingText '${APPNAME} v${VERSIONLONG}'  BrandingText '$0'  !include LogicLib.nsh
!include nsProcess.nsh  #include custom page reference
!include "MUI2.nsh"
!include "nsDialogs.nsh"
!include "kagulaWelcomePage.nsdinc"  # Just three pages - license agreement, install location, and installation
#!insertmacro MUI_PAGE_WELCOME
;Page custom fnc_kagulaWelcomePage_Show
;page license
;page directory
;Page instfiles
!insertmacro MUI_PAGE_LICENSE "license.rtf"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES  !insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH  !insertmacro MUI_LANGUAGE "SimpChinese"  !macro VerifyUserIsAdmin
UserInfo::GetAccountType
pop $0
${If} $0 != "admin" ;Require admin rights on NT4+  messageBox mb_iconstop "需要管理员权限!"  setErrorLevel 740 ;ERROR_ELEVATION_REQUIRED  quit
${EndIf}
!macroend  !include "FileFunc.nsh"
Var VersionNumber  Function VerCheck
pop $0
;${GetFileVersion} "$INSTDIR\${APPEXENAME}" $VersionNumber
${GetFileVersion} "$0" $VersionNumber
FunctionEnd  Function VersionCompare  !define VersionCompare `!insertmacro VersionCompareCall`  !macro VersionCompareCall _VER1 _VER2 _RESULT  Push `${_VER1}`  Push `${_VER2}`  Call VersionCompare  Pop ${_RESULT}  !macroend  Exch $1  Exch  Exch $0  Exch  Push $2  Push $3  Push $4  Push $5  Push $6  Push $7  begin:  StrCpy $2 -1  IntOp $2 $2 + 1  StrCpy $3 $0 1 $2  StrCmp $3 '' +2  StrCmp $3 '.' 0 -3  StrCpy $4 $0 $2  IntOp $2 $2 + 1  StrCpy $0 $0 '' $2  StrCpy $2 -1  IntOp $2 $2 + 1  StrCpy $3 $1 1 $2  StrCmp $3 '' +2  StrCmp $3 '.' 0 -3  StrCpy $5 $1 $2  IntOp $2 $2 + 1  StrCpy $1 $1 '' $2  StrCmp $4$5 '' equal  StrCpy $6 -1  IntOp $6 $6 + 1  StrCpy $3 $4 1 $6  StrCmp $3 '0' -2  StrCmp $3 '' 0 +2  StrCpy $4 0  StrCpy $7 -1  IntOp $7 $7 + 1  StrCpy $3 $5 1 $7  StrCmp $3 '0' -2  StrCmp $3 '' 0 +2  StrCpy $5 0  StrCmp $4 0 0 +2  StrCmp $5 0 begin newer2  StrCmp $5 0 newer1  IntCmp $6 $7 0 newer1 newer2  StrCpy $4 '1$4'  StrCpy $5 '1$5'  IntCmp $4 $5 begin newer2 newer1  equal:  StrCpy $0 0  goto end  newer1:  StrCpy $0 1  goto end  newer2:  StrCpy $0 2  end:  Pop $7  Pop $6  Pop $5  Pop $4  Pop $3  Pop $2  Pop $1  Exch $0
FunctionEnd  function .onInit  setShellVarContext all  !insertmacro VerifyUserIsAdmin  #check program running.  ${nsProcess::FindProcess} ${APPEXENAME} $R0  ${If} $R0 == "0"  # it's running  MessageBox MB_OK "软件正在运行,按确定退出!"  Quit  ${EndIf}  ;    MessageBox MB_OK "当前软件的版本为:${VERSIONLONG}"  #check version from custom install place      ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "MainProgramLocation"  ${If} $0 != ""
;      MessageBox MB_OK "文件位置:$0"  ${If} ${FileExists} $0
;        #if installed version is greater, return 2
;        #else if equality, return 0.
;        #else if less, return 1 and resume install process.
;        #MessageBox MB_OK "Version=$R0"
;       MessageBox MB_OK "before push the parameter for VerCheck function.$0"  push $0  Call VerCheck  ${VersionCompare} $VersionNumber ${VERSIONLONG} $R0  ${if} $R0 != "1"  MessageBox MB_OK "你已经安装同版本或较新版本${APPNAME}软件,按确定退出安装!"  Quit   ${Endif}  ${EndIf}
;    ${Else}
;      MessageBox MB_ICONSTOP "Not found"  ${EndIf}
functionEnd  section "install"  # Files for the install directory - to build the installer, these should be in the same directory as the install script (this file)  setOutPath $INSTDIR  # Files added here should be removed by the uninstaller (see section "uninstall")  File /r "..\issue\"  file "${ICOFULLPATH}"  # Add any other files for the install directory (license files, app data, etc) here  # Uninstaller - See function un.onInit and section "uninstall" for configuration  writeUninstaller "$INSTDIR\uninstall.exe"  # Start Menu  createDirectory "$SMPROGRAMS\${COMPANYNAME}"  createShortCut "$SMPROGRAMS\${COMPANYNAME}\${APPNAME}.lnk" "$INSTDIR\${APPEXENAME}" "" "$INSTDIR\${ICOFILENAME}"  # create a shortcut named "new shortcut" in the start menu programs directory  # point the new shortcut at the program uninstaller  CreateShortCut "$SMPROGRAMS\${COMPANYNAME}\卸载.lnk" "$INSTDIR\uninstall.exe"  # Registry information for add/remove programs  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "DisplayName" "${COMPANYNAME} - ${APPNAME} - ${DESCRIPTION}"  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S"  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "InstallLocation" "$\"$INSTDIR$\""  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "DisplayIcon" "$\"$INSTDIR\${ICOFILENAME}$\""  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "Publisher" "$\"${COMPANYNAME}$\""  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "HelpLink" "$\"${HELPURL}$\""  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "URLUpdateInfo" "$\"${UPDATEURL}$\""  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "URLInfoAbout" "$\"${ABOUTURL}$\""  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "DisplayVersion" "$\"${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONBUILD}.${VERSIONREVISION}$\""  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "VersionMajor" ${VERSIONMAJOR}  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "VersionMinor" ${VERSIONMINOR}  # There is no option for modifying or repairing the install  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "NoModify" 1  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "NoRepair" 1  # Set the INSTALLSIZE constant (!defined at the top of this script) so Add/Remove Programs can accurately report the size  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "EstimatedSize" ${INSTALLSIZE}  #Write file install location to register table.  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "MainProgramLocation" "$INSTDIR\${APPEXENAME}"
sectionEnd  # Uninstaller  function un.onInit  SetShellVarContext all   #Verify the uninstaller - last chance to back out  MessageBox MB_OKCANCEL "确定要移除 ${APPNAME} 吗?" IDOK next  Abort  next:  !insertmacro VerifyUserIsAdmin
functionEnd  section "uninstall"  # Remove Start Menu launcher  delete "$SMPROGRAMS\${COMPANYNAME}\${APPNAME}.lnk"  delete "$SMPROGRAMS\${COMPANYNAME}\卸载.lnk"  # Try to remove the Start Menu folder - this will only happen if it is empty  rmDir "$SMPROGRAMS\${COMPANYNAME}"  # Remove files  delete $INSTDIR\${ICOFILENAME}  # Always delete uninstaller as the last action  delete $INSTDIR\uninstall.exe  # Try to remove the install directory - this will only happen if it is empty  rmDir /r $INSTDIR  # Remove uninstaller information from the registry  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}"
sectionEnd

View Code

Q1、中文问题
参考资料[1]里的nsis-3.0b1-setup.exe是不支持中文的,得下载nsis-2.46.5-Unicode-setup.exe。
源文件设为utf-8编码类型。
采用下面的代码测试
     CreateShortCut "$SMPROGRAMS\中文测试.lnk" "$INSTDIR\uninstall.exe"
     MessageBox MB_OK  "中文测试" 
是可以正常显示中文的。

参考下面的代码段,把安装界面弄成中文
!include "MUI2.nsh"
..................
!insertmacro MUI_LANGUAGE "SimpChinese"

Q2、如何测试进程已经运行?
A:需要四个步骤。
第一步:从“http://nsis.sourceforge.net/NsProcess_plugin”下载nsProcess_1_6.7z
第二步:覆盖NSIS Unicode安装目录的目录树
第三步:把当前plugin目录中的nsProcessW.dll文件复制到Plugins目录并重命名为nsProcess.dll。
第四步:参数下面的代码修改即可
    ${nsProcess::FindProcess} "calc.exe" $R0
    ${If} $R0 == "0"
        # it's running
        MessageBox MB_OK "程序已经运行,按确定退出!"
        Quit
    ${EndIf}

Q3、如何使用NSISDialogDesigner
A1:
使用NSISDialogDesigner生成kagulaWelcomePage.nsdinc文件
在你的nsi主文件里,专门放Page命令的地方,添加下面的代码
!include "MUI2.nsh"
!include "nsDialogs.nsh"
!include "kagulaWelcomePage.nsdinc"

Page custom fnc_kagulaWelcomePage_Show
就会显示你自定义的页面,不过你会发现它是在frame里面。

Q4、关于Modern User Interface同NSIS传统的区别
显示license页面,MUI采用下面这行命令:
LicenseData "license.rtf"
page license
MUI方式采用下面这个命令。
!insertmacro MUI_PAGE_LICENSE "license.rtf"

Q5 如何实现高压缩比

SetCompressor lzma

Q6 NSIS 打包 win7 中无法删除快捷方式

http://www.cnblogs.com/08shiyan/archive/2011/01/10/1931766.html

参数资料
[1]NSIS Dialog Designer
http://coolsoft.altervista.org/en/nsisdialogdesigner#download
[2]NSIS home page
http://nsis.sourceforge.net/Main_Page
[3]Eclipse NSIS
http://eclipsensis.sourceforge.net/index.shtml
[4]Auto-uninstall old before installing new
http://nsis.sourceforge.net/Auto-uninstall_old_before_installing_new
[5]NSIS常见问题集锦 推荐新手参考学习
http://www.jb51.net/softjc/33522.html
[6]Unicode NSIS调用nsProcess插件报错
http://tunps.com/nsis-unicode-nsprocess-error
[7]NSIS detection of a 32-bit process in Win 7 x64
http://stackoverflow.com/questions/5353666/nsis-detection-of-a-32-bit-process-in-win-7-x64
[8]NSIS Modern User Interface
http://nsis.sourceforge.net/Docs/Modern%20UI/Readme.html#examples
[9]Customizing an exsisting NSIS MUI2 page
http://stackoverflow.com/questions/6531115/customizing-an-exsisting-nsis-mui2-page
[10]A sample script that uses several cool functions (replace txt, mutually exclusive functions, MUI, patch install, etc.)
http://nsis.sourceforge.net/A_sample_script_that_uses_several_cool_functions_(replace_txt,_mutually_exclusive_functions,_MUI,_patch_install,_etc.)
[11]NSIS 自定义安装界面准确获取安装进度完美解决方案
http://blog.csdn.net/shuijing_0/article/details/8291299
[12]DB 数据库地址及路径配置函数
http://www.cnblogs.com/freeliver54/archive/2010/11/26/1888902.html
[13]NSIS软件安装完成界面添加“设置主页”代码
http://www.veryhuo.com/a/view/40444.html

转载于:https://www.cnblogs.com/Yjianyong/p/5200364.html

NSIS学习笔记(转)相关推荐

  1. nsis 学习笔记(2)

    nsis 学习笔记(2) 空间 Delete "$SMPROGRAMS\裝箱大師企業版\裝箱大師官方網站.lnk" Delete "$SMPROGRAMS\裝箱大師企業版 ...

  2. nsis访问php,NSIS学习笔记

    NSIS学习笔记 1:定义常量 !ifndef LIEYAN_DLL !define LIEYAN_DLL "LieYan.dll" !endif 2:定义变量 Var CHANN ...

  3. QT学习笔记(三):Qt软件打包发布(QT5.8 _msvc2013_64+Win10_64)

    QT学习笔记(三):Qt软件打包发布(QT5.8 _msvc2013_64+Win10_64) 1.编译方式介绍: 2.动态编译方式打包发布QT程序: 方法一:手动复制 方法二:使用工具 问题& ...

  4. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  5. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  6. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  7. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  8. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  9. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

最新文章

  1. 企业建设网站之前需要做好哪些基本了解?
  2. 如何让程序跑起来――第三章
  3. 【渝粤教育】国家开放大学2018年秋季 0727-21T思想道德修养与法律基础 参考试题
  4. 封装绑定以BaseDataList , ListControl 为基类的函数库
  5. The serializable class XXX does not declare a static final serialVersionUID field of type long的警告...
  6. 61二叉搜索树的第k个结点
  7. 【mongodb系统学习之四】查看mongodb进程
  8. Guava常用工具类的使用
  9. 《Android 面试指南》来自腾讯、阿里巴巴、欢聚时代、美团、聚美优品、悦跑圈等大佬分享的面经...
  10. manifest.json文件的 “name” “description” “version 字段解释
  11. Hough变换检测圆
  12. 傅里叶变换与拉普拉斯变换
  13. HTML 表格滚动锁定表头,实现固定行列
  14. 163vip邮箱登陆入口,怎么登录163邮箱?
  15. VMware报错:无法获得VMCI驱动程序的版本:句柄无效。驱动程序vmci.sys的版本不正确
  16. 王爽汇编语言 实验7
  17. 灰度巡线传感器_探索者D1系列教程十 巡线传感器
  18. MySQL查询某段日期内某段时间内的数据
  19. 935.Knight Dialer [JavaScript]
  20. C#序列化反序列化读写XML文件

热门文章

  1. css基础内容之background
  2. 51nod 1180 方格射击游戏
  3. Win8 64位安装Oracle 11g时错
  4. 数学图形(1.49)Nephroid曲线
  5. 解决 GDI 贴图的闪烁
  6. HDOJ2026 ( 首字母变大写 ) 【水题】
  7. 【转载】印制板设计的流程及注意事项
  8. 今生一定娶美女 不遇美女终生不娶
  9. MySQL索引背后的数据结构及算法原理(employees实例)
  10. 关于.net ashx一般处理文件中取不到session问题