杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2360|回复: 0

NSIS 安装脚本[学习]

[复制链接]
发表于 2017-12-22 16:42:47 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. ; 该脚本使用 HM VNISEdit 脚本编辑器向导产生

  2. ; 安装程序初始定义常量
  3. !define PRODUCT_NAME "管理系统"
  4. !define PRODUCT_VERSION "1.0"
  5. !define PRODUCT_PUBLISHER "信息科技有限公司"
  6. !define PRODUCT_WEB_SITE "http://www.公司.com"
  7. !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\可执行文件.exe"
  8. !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
  9. !define PRODUCT_UNINST_ROOT_KEY "HKLM"

  10. SetCompressor lzma

  11. ; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------
  12. !include "MUI.nsh"
  13. !include "nsDialogs.nsh"


  14. ; MUI 预定义常量
  15. !define MUI_ABORTWARNING
  16. !define MUI_ICON "C:\本地路径\安装\install.ico"
  17. !define MUI_UNICON "C:\本地路径\安装\uninstall.ico"

  18. ; 欢迎页面
  19. !insertmacro MUI_PAGE_WELCOME
  20. ; 安装目录选择页面
  21. !insertmacro MUI_PAGE_DIRECTORY
  22. ; 安装过程页面
  23. !insertmacro MUI_PAGE_INSTFILES
  24. ; 安装完成页面
  25. !define MUI_FINISHPAGE_RUN "$INSTDIR\可执行文件.exe"

  26. !define MUI_FINISHPAGE_SHOWREADME ""
  27. !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
  28. !define MUI_FINISHPAGE_SHOWREADME_TEXT "开机启动"
  29. !define MUI_FINISHPAGE_SHOWREADME_FUNCTION finishpageaction
  30. ;Page custom PageOtherTask
  31. !insertmacro MUI_PAGE_FINISH

  32. ; 安装卸载过程页面
  33. !insertmacro MUI_UNPAGE_INSTFILES

  34. ; 安装界面包含的语言设置
  35. !insertmacro MUI_LANGUAGE "SimpChinese"

  36. ; 安装预释放文件
  37. !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
  38. ; ------ MUI 现代界面定义结束 ------

  39. Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
  40. OutFile "setup.exe"
  41. InstallDir "$PROGRAMFILES\公司\产品"
  42. InstallDirRegKey HKLM "${PRODUCT_UNINST_KEY}" "UninstallString"
  43. ShowInstDetails show
  44. ShowUnInstDetails show
  45. BrandingText "信息科技有限公司"
  46. RequestExecutionLevel admin
  47. ;RequestExecutionLevel admin #NOTE: You still need to check user rights with UserInfo!

  48. Section "MainSection" SEC01
  49.     setShellVarContext all
  50.   SetOutPath "$INSTDIR"
  51.   SetOverwrite ifnewer
  52.   CreateDirectory "$SMPROGRAMS\公司\产品"
  53.   CreateShortCut "$SMPROGRAMS\公司\产品\${PRODUCT_NAME}.lnk" "$INSTDIR\可执行文件.exe"
  54.   CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\可执行文件.exe"
  55.   File "本地文件"
  56. 。。。
  57. 。。。
  58. 。。。
  59. 。。。
  60.   CreateDirectory "$INSTDIR\Log"
  61.   SetOutPath "$INSTDIR\Log"
  62.   File "本地文件"
  63. SectionEnd

  64. Section -AdditionalIcons
  65.   CreateShortCut "$SMPROGRAMS\公司\产品\Uninstall.lnk" "$INSTDIR\uninst.exe"
  66. SectionEnd

  67. Section -Post
  68.   WriteUninstaller "$INSTDIR\uninst.exe"
  69.   WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\可执行文件.exe"
  70.   WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
  71.   WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
  72.   WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\可执行文件.exe"
  73.   WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  74.   WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
  75.   WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
  76. SectionEnd


  77. /******************************
  78. *  以下是安装程序的卸载部分  *
  79. ******************************/

  80. Section Uninstall
  81.     setShellVarContext all
  82.   Delete "$INSTDIR\文件.exe"
  83.   Delete "$INSTDIR\文件.exe"
  84.   Delete "$INSTDIR\文件.config"
  85.   Delete "$INSTDIR\文件.dll"

  86.   Delete "$SMPROGRAMS\公司\产品\Uninstall.lnk"
  87.   Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
  88.   Delete "$SMPROGRAMS\公司\产品\${PRODUCT_NAME}.lnk"

  89.   RMDir "$SMPROGRAMS\公司\产品"

  90.   RMDir "$INSTDIR\Log"
  91.   RMDir "$INSTDIR"

  92.   DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  93.   DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
  94.   DeleteRegKey HKCU  "SOFTWARE\Microsoft\Windows\CurrentVersion\Run\产品"
  95.   SetAutoClose true
  96. SectionEnd

  97. #-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--#

  98. Function .onInit
  99.     FindProcDLL::FindProc "可执行文件.exe"
  100.     Sleep 500
  101.     Pop $R0
  102.     ${If} $R0 != 0
  103.     KillProcDLL::KillProc "可执行文件.exe"
  104.     ${EndIf}
  105.    
  106.     FindProcDLL::FindProc "Update.exe"
  107.     Sleep 500
  108.     Pop $R0
  109.     ${If} $R0 != 0
  110.     KillProcDLL::KillProc "Update.exe"
  111.     ${EndIf}
  112. FunctionEnd

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

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


  121. Function finishpageaction
  122.     WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" "产品" "$INSTDIR\可执行文件.exe"
  123. FunctionEnd
复制代码


以上是正常情况,没有判断.net环境

如果我们需要判断.net环境是事安装,需要以下脚本
  1. Function GetNetFrameworkVersion
  2. ;获取.Net Framework版本,支持
  3. Push $1
  4. Push $0
  5. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Install"
  6. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Version"
  7. StrCmp $1 "" +1 +2
  8. StrCpy $1 "3.5"
  9. StrCmp $0 1 KnowNetFrameworkVersion +1
  10. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "InstallSuccess"
  11. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "Version"
  12. StrCmp $1 "" +1 +2
  13. StrCpy $1 "3.0"
  14. StrCmp $0 1 KnowNetFrameworkVersion +1
  15. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Install"
  16. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Version"
  17. StrCmp $1 "" +1 +2
  18. StrCpy $1 "2.0.50727.832"
  19. StrCmp $0 1 KnowNetFrameworkVersion +1
  20. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Install"
  21. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Version"
  22. StrCmp $1 "" +1 +2
  23. StrCpy $1 "1.1.4322.573"
  24. StrCmp $0 1 KnowNetFrameworkVersion +1
  25. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Install"
  26. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Version"
  27. StrCmp $1 "" +1 +2
  28. StrCpy $1 "1.0.3705.0"
  29. StrCmp $0 1 KnowNetFrameworkVersion +1
  30. StrCpy $1 "not .NetFramework"
  31. KnowNetFrameworkVersion:
  32. Pop $0
  33. Exch $1
  34. FunctionEnd

  35. Function CheckFramework4
  36. ;Clinet 和 Full存在一个都说明安装了Framework
  37. ClearErrors
  38. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" "Install2"
  39. IfErrors 0 ExitCheckFramework4
  40.   ClearErrors
  41.   ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install"
  42. IfErrors 0 ExitCheckFramework4
  43.     ;没有安装Framework
  44.     MessageBox MB_OK "装程序无法检测到.NET Framework V4,这是必须安装的。安装程序将中止。"
  45.     Abort
  46. ExitCheckFramework4:
  47. FunctionEnd
复制代码

由于nsis要求所有function必须在section之后,因此,这些自定义函数一般放到最后

在section之前加一个.net判断的section
  1. Section -.NET
  2. Call GetNetFrameworkVersion
  3. Pop $R1
  4.   ${If} $R1 < '3.5'

  5.   NSISdl::download /TRANSLATE2 '正在下载 %s' '正在连接...' '(剩余 1 秒)' '(剩余 1 分钟)' '(剩余 1 小时)' '(剩余 %u 秒)' '(剩余 %u 分钟)' '(剩余 %u 小时)' '已完成:%skB(%d%%) 大小:%skB 速度:%u.%01ukB/s' /TIMEOUT=7500 /NOIEPROXY 'http://192.168.200.195/dotNetFx40_Full_x86_x64.exe' '$TEMP\dotNetFx40_Full_x86_x64.exe'
  6.   Pop $R0
  7.   StrCmp $R0 "success" 0 +3
  8.   ;MessageBox MB_YESNO|MB_ICONQUESTION "dotNetFx40_Full_x86_x64.exe 已成功下载。$\r$\n是否立即安装?" IDNO +2

  9.   SetDetailsPrint textonly
  10.   DetailPrint "正在安装 .NET Framework ..."
  11.   SetDetailsPrint listonly
  12.   ExecWait '$TEMP\dotNetFx40_Full_x86_x64.exe /norestart' $R1
  13.   Delete "$TEMP\dotNetFx40_Full_x86_x64.exe"

  14.   ${If} $R1 != 0
  15.     MessageBox MB_OK "装程序无法检测到.NET Framework,这是必须安装的。安装程序将中止。"
  16.     ;Abort
  17.     Quit
  18.   ${EndIf}
  19.   ${EndIf}
  20. SectionEnd
复制代码

以上代码会检察.net是否安装与.net判断,并自动从指定url下载并安装

当需要把.net打包进安装程序时(此时会大副增加安装文件体积)
  1. Section -.NET
  2. Call GetNetFrameworkVersion
  3. Pop $R1
  4.   ${If} $R1 < '3.5'
  5.   SetDetailsPrint textonly
  6.   DetailPrint "正在安装 .NET Framework ..."
  7.   SetDetailsPrint listonly

  8.   SetOutPath "$TEMP"
  9.   SetOverwrite on
  10.   File "C:\。。。。\安装\dotNetFx40_Full_x86_x64.exe"
  11.   ExecWait '$TEMP\dotNetFx40_Full_x86_x64.exe /norestart' $R1
  12.   Delete "$TEMP\dotNetFx40_Full_x86_x64.exe"

  13.   ${If} $R1 != 0
  14.     MessageBox MB_OK "装程序无法检测到.NET Framework,这是必须安装的。安装程序将中止。"
  15.     ;Abort
  16.     Quit
  17.   ${EndIf}
  18.   ${EndIf}
  19. SectionEnd
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-18 03:34 , Processed in 0.111317 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表