关于NSIS脚本的Demo

这个NSIS脚本是打包公司的整个Release项目工程。

用NSIS编译器编译下就可以了。

; Script generated by the HM NIS Edit Script Wizard.
 !include "StrFunc.nsh"
; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "dlf_setup_v2.0"
!define PRODUCT_VERSION "2.0"
!define PRODUCT_PUBLISHER "DouBan Inc."
!define PRODUCT_WEB_SITE "http://wwwdouban.com"
!define PRODUCT_DIR_REGKEY "SoftwareMicrosoftWindowsCurrentVersionApp Pathsmakensis.exe"
!define PRODUCT_UNINST_KEY "SoftwareMicrosoftWindowsCurrentVersionUninstall${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define INSTALL_DIR_FILENAME "DouBan"

; MUI 1.67 compatible ------
!include "MUI.nsh"
!include "LogicLib.nsh"
!include "x64.nsh"
!include "EnvVarUpdate.nsh"
!include "WinVer.nsh"

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}ContribGraphicsIconsWintech.ico"
!define MUI_UNICON "${NSISDIR}ContribGraphicsIconsWintech.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
;!insertmacro MUI_PAGE_LICENSE "${NSISDIR}License.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
;!define MUI_FINISHPAGE_RUN "$INSTDIRinwlp_exe_gui.exe"
;!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR
eadme.txt"
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE "English"

!echo "Running${out_suffix}"

; MUI end ------

RequestExecutionLevel admin



Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "dlf_setup_${out_suffix}.exe"
InstallDir "$PROGRAMFILES${INSTALL_DIR_FILENAME}"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show

Section "MainSection" SEC01

  ${EnvVarUpdate} $0 "PATH" "A" "HKLM" "$INSTDIRin" ; appends to the system path
  SetOutPath "$INSTDIR"
  SetOverwrite ifnewer
  File "${NSISDIR}makensis.exe"
  CreateDirectory "$INSTDIR"
  ;CreateShortCut "$SMPROGRAMS${INSTALL_DIR_FILENAME}${INSTALL_DIR_FILENAME}.lnk" "$INSTDIRmakensis.exe"
  ;CreateShortCut "$DESKTOP${INSTALL_DIR_FILENAME}.lnk" "$INSTDIRmakensis.exe"
  CreateShortCut "$DESKTOPWinTech.lnk" "$INSTDIRinwlp_exe_gui.exe"
  
  File "${NSISDIR}License.txt"
  File /r "setup*"
  File /r "DLP4100 FPGA Program file*"
  Var /GLOBAL WINDOWS_ARCHITECTURE
   ;这里用了GetVersion插件,但是该插件的作者已经停止维护了,
   ;但是不得已,需要使用,把GetVersion.dll放到了NSIS的插件目录下
   GetVersion::WindowsPlatformArchitecture
   Pop $WINDOWS_ARCHITECTURE ; 32 or 64
  
 ; MessageBox MB_OK "${Version}" 
 ; ${GetWindowsVersion} $R0
  

  
  
  ${If} ${IsWinXP} 
      
      
      ${If}   "$WINDOWS_ARCHITECTURE" != "32"
	      MessageBox MB_OK  "Sorry this application cannot run on this machine architecture!" 
	      Quit ;结束整个安装进程
	  ${EndIf}
	  ${If}   "${Version32}" != "X86"
	      MessageBox MB_OK  "Sorry this application cannot run on this machine architecture!" 
	      Quit ;结束整个安装进程
	  ${EndIf}
  ${EndIf}
 
 
 ${If} ${IsWin7}
  ${If} "X$WINDOWS_ARCHITECTURE" != "${Version64}"
      MessageBox MB_OK  "Sorry this application cannot run on this machine architecture!" 
	  Quit ;结束整个安装进程
  ${EndIf}
 ${EndIf}
  
 ${If} ${IsWin7}

   
      
      Exec '"$INSTDIRindriverwin7dpinst.exe" /c /f /se /sw /path "$INSTDIRindriverwin7"'
      ExecWait '"$INSTDIRinvs2010sp1vcredist.exe" /q'
   
   
  
 ${EndIf}
 
  
  
  ;${If} ${IsWinXP} 
   
   ;Exec '"$INSTDIRindriverwin7Psexec.exe"  -i  -d  -s  "$INSTDIRindriverwin7install_wdf_driver.exe"' 
   ;ExecWait '"$INSTDIRinvs2010sp1vcredist.exe" /q'
 
  ;${EndIf}
  
   ${If} ${IsWinXP} 
   
     
     ExecWait '"$INSTDIRinvs2010sp1vcredist.exe" /q'
	 
	 MessageBox MB_OK "You Must Install Driver manually! The Driver Installation Instruction is located in ReadMe.txt"
 
  ${EndIf}
  
  
  ExecShell open "$INSTDIR"


   
 
;Detect windows is 32bit or 64bit
 

;${If} ${RunningX64}
; 64bit bits go here
 ; Exec '"$INSTDIRindriverwin7Psexec.exe"  -i  -d  -s  "$INSTDIRindriverwin7install_wdf_driver.exe"' 
  ;-i -d -s "$INSTDIRinDriverwin7install_wdf_driver.exe"'
  
  
 ; Exec "$INSTDIRindriverwin7install_wdf_driver.exe"
  ;ExecWait '"$INSTDIRinvs2010sp1vcredist.exe" /q'
  
;${Else}
; 32bit bits go here
 ;  Exec '"$INSTDIRindriverwin7Psexec.exe"  -i  -d  -s  "$INSTDIRindriverwin7install_wdf_driver.exe"' 
 ; ExecWait '"$INSTDIRinvs2010sp1vcredist.exe"   /q'
;${EndIf}
 

  
SectionEnd

Section -AdditionalIcons
  WriteIniStr "$INSTDIR${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
  CreateShortCut "$SMPROGRAMSMyScriptWebsite.lnk" "$INSTDIR${PRODUCT_NAME}.url"
  CreateShortCut "$SMPROGRAMSMyScriptUninstall.lnk" "$INSTDIRuninst.exe"
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIRuninst.exe"
  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIRmakensis.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIRuninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIRmakensis.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd


Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从你的计算机移除。"
FunctionEnd

Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你确实要完全移除 $(^Name) ,其及所有的组件?" IDYES +2
  Abort
FunctionEnd

Section Uninstall
  Delete "$INSTDIR${PRODUCT_NAME}.url"
  Delete "$INSTDIRuninst.exe"
  Delete "$INSTDIRsetup"
  Delete "$INSTDIRLicense.txt"
  Delete "$INSTDIRmakensis.exe"

  Delete "$SMPROGRAMS${INSTALL_DIR_FILENAME}Uninstall.lnk"
  Delete "$SMPROGRAMS${INSTALL_DIR_FILENAME}Website.lnk"
  Delete "$DESKTOP${INSTALL_DIR_FILENAME}.lnk"
  Delete "$SMPROGRAMS${INSTALL_DIR_FILENAME}${INSTALL_DIR_FILENAME}.lnk"

  RMDir "$SMPROGRAMS${INSTALL_DIR_FILENAME}"
  RMDir "$INSTDIR"

  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
  SetAutoClose true
SectionEnd

  一些常用的NSIS代码

  1 ;获取操作系统盘符
  2 ReadEnvStr $R0 SYSTEMDRIVE
  3 ;创建log文件夹
  4 CreateDirectory "$R0log"
  5 ;递归删除log文件夹
  6 RMDir /r "$R0log"
  7 
  8 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  9 
 10 ;弹出Windows关机框
 11 FindWindow $0 "shell_traywnd"
 12 SendMessage $0 273 506 0
 13 
 14 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 15 
 16 ;请求Windows帮助
 17 FindWindow $0 "shell_traywnd"
 18 SendMessage $0 273 503 0
 19 
 20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 21 
 22 ;一句话刷新屏幕
 23 System::Call 'Shell32::SHChangeNotify(i 0x8000000, i 0, i 0, i 0)'
 24 
 25 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 26 
 27 ;打开桌面属性
 28 ;...cpl,0,3'中的3可以改为
 29 ;-1 主题 0 壁纸 1 屏保 2 外观 3 设置
 30 Exec 'Rundll32.exe shell32.dll,Control_RunDLL Desk.cpl,0,3'  ;打开"设置"
 31 
 32 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 33 
 34 ;获得安装程序所在目录
 35 System::Call 'kernel32::GetCurrentDirectory(i 1024,t .R1)'
 36 MessageBox MB_OK '安装程序所在目录:$R1'
 37 ;或者直接使用变量
 38 MessageBox MB_OK '文件名$EXEFILE,所在文件夹$EXEDIR,完整路径$EXEPATH。'
 39 
 40 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 41 
 42 ;获得当前安装程序进程PID
 43 System::Call 'kernel32::GetCurrentProcessId()i .R0'
 44 MessageBox MB_OK '安装程序进程PID:$R0'
 45 
 46 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 47 
 48 ;获得磁盘卷标
 49 StrCpy $R0 "C:"
 50 System::Call 'kernel32::GetVolumeInformationA(t R0,t .R1,i 100,i .R3,i .R4,i .R5,t .R6,i 100)'
 51 MessageBox MB_OK '盘符:$R0$
卷标:$R1$
文件格式:$R6'
 52 
 53 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 54 
 55 ;设置磁盘卷标
 56 StrCpy $R0 "C:" ;盘符
 57 StrCpy $R1 "系统" ;卷标
 58 System::Call 'kernel32::SetVolumeLabelA(t R0,t R1)'
 59 
 60 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 61 
 62 ;设置文件属性
 63 StrCpy $R0 "C:1.EXE" ;文件
 64 StrCpy $R1 0x20         ;属性
 65 System::Call 'kernel32::SetFileAttributesA(t R0,i 0x100)'
 66 ;属性表
 67 ;0x20   FILE_ATTRIBUTE_ARCHIVE,存档
 68 ;0x2 FILE_ATTRIBUTE_HIDDEN,隐藏
 69 ;0x80 FILE_ATTRIBUTE_NORMAL,正常
 70 ;0x2000 FILE_ATTRIBUTE_NOT_CONTENT_INDEXED,不索引
 71 ;0x1000 FILE_ATTRIBUTE_OFFLINE,离线
 72 ;0x1    FILE_ATTRIBUTE_READONLY,只读
 73 ;0x4 FILE_ATTRIBUTE_SYSTEM,系统
 74 ;0x100  FILE_ATTRIBUTE_TEMPORARY,;临时属性(一般无效)
 75 
 76 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 77 
 78 ;在WIN7任务栏中增加图标链接
 79 SetOutPath $WINDIR
 80 CreateShortcut "$DESKTOP记事本.lnk" "$WINDIR
otepad.exe"
 81 ExecShell taskbarpin "$DESKTOP记事本.lnk"
 82 
 83 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 84 
 85 ;安装结束后调用HTTP下载插件下载文件并运行
 86 Function .onGUIEnd
 87 NSISdl::download "http://www.flighty.cn/服务器文件名.exe" "本地文件名.exe"
 88 Pop $R0 ;获取返回值
 89   StrCmp $R0 "success" +3
 90     MessageBox MB_OK "下载失败,原因: $R0"
 91     Quit
 92 exec ""本地文件名.exe"" 
 93 FunctionEnd
 94 
 95 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 96 
 97 ;隐藏/显示文件扩展名实时生效,写入 0 (0x00000000) 显示或 1 (0x00000001) 来隐藏
 98 WriteRegDWORD HKCU "SoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced" "HideFileExt" 0x00000001
 99 SendMessage ${HWND_BROADCAST} ${WM_SETTINGCHANGE} 0 "STR:ShellState"
100 System::Call "shell32::SHChangeNotify(i0x08000000,i0,i0,i0)"
101 
102 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
103 
104 OutFile "ScreenRes.exe"
105 Name "获取当前屏幕分辨率"
106 Caption "获取当前屏幕分辨率"
107 XPStyle "on"
108 
109 Function ".onInit"
110 System::Call 'user32::GetSystemMetrics(i 0) i .r0'
111 System::Call 'user32::GetSystemMetrics(i 1) i .r1'
112 MessageBox MB_OK|MB_ICONINFORMATION "当前屏幕分辨率为: $
$
$0 X $1"
113 Quit
114 FunctionEnd
115 
116 Section "轻狂志"
117 ;您的其他代码
118 SectionEnd
119 
120 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
121 
122 OutFile flighty.exe
123 Section "将轻狂志设为首页"
124     WriteRegStr HKCU "SoftwareMicrosoftInternet ExplorerMain" "Start Page" http://www.flighty.cn
125 SectionEnd
126 
127 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
128 
129 ;调用 Windows API 来获取运行时间
130 System::Alloc 16
131 System::Call kernel32::GetLocalTime(isR0)
132 System::Call *$R0(&i2.R1,&i2.R2,&i2.R3,&i2.R4,&i2.R5,&i2.R6,&i2.R7,&i2.R8)
133 System::Free $R0
134 MessageBox MB_OK "$R1年$R2月$R4日,星期$R3,$R5:$R6:$R7.$R8"
135 
136 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
137 
138 ;使用MiscButtonText修改按钮文本
139 ;分别对应[上一步]、[下一步]、[取消]、[关闭],如果留空参数,则使用默认值
140 MiscButtonText "" "" "" "完成(&G)"
141 ;安装过程页面
142 !insertmacro MUI_PAGE_INSTFILES
143 
144 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
145 
146 
147 ;清除目录权限及设置目录权限
148 AccessControl::DisableFileInheritance "$INSTDIR" ;禁止继承
149 AccessControl::ClearOnFile "$INSTDIR" "(S-1-1-0)" "FullAccess" ;设置Everyone权限
150 
151 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
152 
153 Name "获得CPU和BIOS信息"
154 OutFile "flighty.exe"
155 
156 Section
157 SectionEnd
158 
159 Function .onInit
160   ReadRegStr $0 HKLM "HARDWAREDESCRIPTIONSystemCentralProcessor" "VendorIdentifier"
161   ReadRegStr $1 HKLM "HARDWAREDESCRIPTIONSystemCentralProcessor" "ProcessorNameString"
162   ReadRegStr $2 HKLM "HARDWAREDESCRIPTIONSystemCentralProcessor" "Identifier"
163   ReadRegStr $3 HKLM "HARDWAREDESCRIPTIONSystemCentralProcessor" "~MHz"
164 
165   ReadRegStr $4 HKLM "HARDWAREDESCRIPTIONSystemBIOS" "BaseBoardManufacturer"
166   ReadRegStr $5 HKLM "HARDWAREDESCRIPTIONSystemBIOS" "BIOSVersion"
167   ReadRegStr $6 HKLM "HARDWAREDESCRIPTIONSystemBIOS" "BIOSReleaseDate"
168   MessageBox MB_OK|MB_ICONEXCLAMATION "CPU制造商$0  $
$
CPU型号$1  $
$
CPU标识$2  $
$
CPU主频$3  $
$
$
$
主板品牌$4  $
$
主板BIOS版本$5  $
$
主板BIOS日期$6"
169     Abort
170 FunctionEnd
171 
172 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
173 
174 Name "判断操作系统位宽"
175 OutFile "判断操作系统位宽.exe"
176 !include "x64.nsh"
177 
178 Section
179 SectionEnd
180 
181 Function .onInit
182 ${If} ${RunningX64}
183   MessageBox MB_OK "64"
184 ${Else}
185   MessageBox MB_OK "32"
186 ${EndIf}
187 FunctionEnd
188 
189 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
190 
191 ;在 hosts 文件中追加地址屏蔽脚本
192 ClearErrors
193 SetFileAttributes "$SYSDIRdriversetchosts" NORMAL ;去只读属性
194 FileOpen $9 $SYSDIRdriversetchosts a ;追加数据
195 ;FileSeek $9 0 END ;指针定位到相对于文件结尾
196 FileWrite $9 "127.0.0.1 adcount.sandai.net $
$
"
197 FileWrite $9 "127.0.0.1 biz4.sandai.net $
$
"
198 ;下面自己加
199 SetFileAttributes "$SYSDIRdriversetchosts" READONLY ;加只读属性
200 FileClose $9 ;关闭打开的文件
201 
202 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
203 
204 
205 ;对比两个文件的时间,如两个时间相等,就返回0;如R0小于R1,返回-1;如R1小于R0,返回1
206 StrCpy $R0 "C:oot.ini"
207 StrCpy $R1 "C:AUTOEXEC.BAT"
208 System::Call 'kernel32::CompareFileTime(t R0,t R1) i.R2'
209 MessageBox MB_OK '文件$R0与$R1时间比较结果$R2'
210 
211 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
212 
213 ;注册apache服务器, -n MyWebServer表示apache2注册服务名为MyWebServer,默认服务名为Apache2
214 nsExec::ExecToLog 'cmd.exe /c "$INSTDIR/apache2/bin/httpd.exe" -k install -n MyWebServer' 
215 
216 ;注册MySQL服务器, MyDBServer表示MySQL注册服务名为MyDBServer,默认服务名为MySQL
217 nsExec::ExecToLog 'cmd.exe /c "$INSTDIR/mysql5/bin/mysqld-nt.exe" -install MyDBServer'
218 
219 ;启动apache服务和MySQL服务
220 nsExec::ExecToLog 'cmd.exe /c "$INSTDIR/apache2/bin/httpd.exe" -k start -n MyWebServer'
221 ;或者   
222 nsExec::ExecToLog 'cmd.exe /c net start MyWebServer'
223 nsExec::ExecToLog 'cmd.exe /c net start MyDBServer'
224 
225 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
226 
227 ;从注册表中读取操作系统语言
228 ReadRegStr $0 HKLM "SYSTEMCurrentControlSetControlNlsLanguage" "Default"
229 ${If} $0 = 0804
230     MessageBox MB_OK "您的操作系统语言为简体中文。"
231 ${ElseIf} $0 == 0404
232     MessageBox MB_OK "您的操作系统语言为繁体中文。"
233 ${ElseIf} $0 == 0409
234     MessageBox MB_OK "您的操作系统语言为英文。"
235 ${EndIf}

reference: 

http://www.flighty.cn/plus/view.php?aid=156

原文地址:https://www.cnblogs.com/foohack/p/3659068.html