这个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