!define PRODUCT_NAME " 管理系统 " !define PRODUCT_VERSION " 1.0 " !define PRODUCT_PUBLISHER " 信息科技有限公司 " !define PRODUCT_WEB_SITE " http://www.公司.com " !define PRODUCT_DIR_REGKEY " Software\Microsoft\Windows\CurrentVersion\App Paths\可执行文件.exe " !define PRODUCT_UNINST_KEY " Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME} " !define PRODUCT_UNINST_ROOT_KEY " HKLM " SetCompressor lzma ; ------ MUI 现代界面定义 ( 1.67 版本以上兼容) ------ !include " MUI.nsh " !include " nsDialogs.nsh " ; MUI 预定义常量 ! define MUI_ABORTWARNING !define MUI_ICON " C:\本地路径\安装\install.ico " !define MUI_UNICON " C:\本地路径\安装\uninstall.ico " ; 欢迎页面 ! insertmacro MUI_PAGE_WELCOME ; 安装目录选择页面 ! insertmacro MUI_PAGE_DIRECTORY ; 安装过程页面 ! insertmacro MUI_PAGE_INSTFILES ; 安装完成页面 !define MUI_FINISHPAGE_RUN " $INSTDIR\可执行文件.exe " !define MUI_FINISHPAGE_SHOWREADME "" ! define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED !define MUI_FINISHPAGE_SHOWREADME_TEXT " 开机启动 " ! define MUI_FINISHPAGE_SHOWREADME_FUNCTION finishpageaction ;Page custom PageOtherTask ! insertmacro MUI_PAGE_FINISH ; 安装卸载过程页面 ! insertmacro MUI_UNPAGE_INSTFILES ; 安装界面包含的语言设置 !insertmacro MUI_LANGUAGE " SimpChinese " ; 安装预释放文件 ! insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ; ------ MUI 现代界面定义结束 ------ Name " ${PRODUCT_NAME} ${PRODUCT_VERSION} " OutFile " setup.exe " InstallDir " $PROGRAMFILES\公司\产品 " InstallDirRegKey HKLM " ${PRODUCT_UNINST_KEY} " " UninstallString " ShowInstDetails show ShowUnInstDetails show BrandingText " 信息科技有限公司 " RequestExecutionLevel admin ;RequestExecutionLevel admin #NOTE: You still need to check user rights with UserInfo ! Section " MainSection " SEC01 setShellVarContext all SetOutPath " $INSTDIR " SetOverwrite ifnewer CreateDirectory " $SMPROGRAMS\公司\产品 " CreateShortCut " $SMPROGRAMS\公司\产品\${PRODUCT_NAME}.lnk " " $INSTDIR\可执行文件.exe " CreateShortCut " $DESKTOP\${PRODUCT_NAME}.lnk " " $INSTDIR\可执行文件.exe " File " 本地文件 " CreateDirectory " $INSTDIR\Log " SetOutPath " $INSTDIR\Log " File " 本地文件 " SectionEnd Section - AdditionalIcons CreateShortCut " $SMPROGRAMS\公司\产品\Uninstall.lnk " " $INSTDIR\uninst.exe " SectionEnd Section - Post WriteUninstaller " $INSTDIR\uninst.exe " WriteRegStr HKLM " ${PRODUCT_DIR_REGKEY} " "" " $INSTDIR\可执行文件.exe " WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} " ${PRODUCT_UNINST_KEY} " " DisplayName " " $(^Name) " WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} " ${PRODUCT_UNINST_KEY} " " UninstallString " " $INSTDIR\uninst.exe " WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} " ${PRODUCT_UNINST_KEY} " " DisplayIcon " " $INSTDIR\可执行文件.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 /* ***************************** * 以下是安装程序的卸载部分 * ***************************** */ Section Uninstall setShellVarContext all Delete " $INSTDIR\文件.exe " Delete " $INSTDIR\文件.exe " Delete " $INSTDIR\文件.config " Delete " $INSTDIR\文件.dll " Delete " $SMPROGRAMS\公司\产品\Uninstall.lnk " Delete " $DESKTOP\${PRODUCT_NAME}.lnk " Delete " $SMPROGRAMS\公司\产品\${PRODUCT_NAME}.lnk " RMDir " $SMPROGRAMS\公司\产品 " RMDir " $INSTDIR\Log " RMDir " $INSTDIR " DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} " ${PRODUCT_UNINST_KEY} " DeleteRegKey HKLM " ${PRODUCT_DIR_REGKEY} " DeleteRegKey HKCU " SOFTWARE\Microsoft\Windows\CurrentVersion\Run\产品 " SetAutoClose true SectionEnd # -- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。-- # Function .onInit FindProcDLL::FindProc " 可执行文件.exe " Sleep 500 Pop $R0 ${If} $R0 != 0 KillProcDLL::KillProc " 可执行文件.exe " ${EndIf} FindProcDLL::FindProc " Update.exe " Sleep 500 Pop $R0 ${If} $R0 != 0 KillProcDLL::KillProc " Update.exe " ${EndIf} FunctionEnd Function un.onInit MessageBox MB_ICONQUESTION |MB_YESNO|MB_DEFBUTTON2 " 您确实要完全移除 $(^Name) ,及其所有的组件? " IDYES + 2 Abort FunctionEnd Function un.onUninstSuccess HideWindow MessageBox MB_ICONINFORMATION |MB_OK " $(^Name) 已成功地从您的计算机移除。 " FunctionEnd Function finishpageaction WriteRegStr HKCU " SOFTWARE\Microsoft\Windows\CurrentVersion\Run " " 产品 " " $INSTDIR\可执行文件.exe " FunctionEnd

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

如果我们需要判断.net环境是事安装,需要以下脚本

Function GetNetFrameworkVersion
;获取.Net Framework版本,支持
Push $1
Push $0
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Install"
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Version"
StrCmp $1 "" +1 +2
StrCpy $1 "3.5"
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "InstallSuccess"
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "Version"
StrCmp $1 "" +1 +2
StrCpy $1 "3.0"
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Install"
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Version"
StrCmp $1 "" +1 +2
StrCpy $1 "2.0.50727.832"
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Install"
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Version"
StrCmp $1 "" +1 +2
StrCpy $1 "1.1.4322.573"
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Install"
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Version"
StrCmp $1 "" +1 +2
StrCpy $1 "1.0.3705.0"
StrCmp $0 1 KnowNetFrameworkVersion +1
StrCpy $1 "not .NetFramework"
KnowNetFrameworkVersion:
Pop $0
Exch $1
FunctionEnd
Function CheckFramework4
 ;Clinet 和 Full存在一个都说明安装了Framework
 ClearErrors
 ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" "Install2"
 IfErrors 0 ExitCheckFramework4
  ClearErrors
  ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install"
 IfErrors 0 ExitCheckFramework4
    ;没有安装Framework
    MessageBox MB_OK "装程序无法检测到.NET Framework V4,这是必须安装的。安装程序将中止。"
    Abort
 ExitCheckFramework4:
FunctionEnd

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

在section之前加一个.net判断的section

Section -.NET
Call GetNetFrameworkVersion
Pop $R1
  ${If} $R1 < '3.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'
  Pop $R0
  StrCmp $R0 "success" 0 +3
  ;MessageBox MB_YESNO|MB_ICONQUESTION "dotNetFx40_Full_x86_x64.exe 已成功下载。$\r$\n是否立即安装?" IDNO +2
  SetDetailsPrint textonly
  DetailPrint "正在安装 .NET Framework ..."
  SetDetailsPrint listonly
  ExecWait '$TEMP\dotNetFx40_Full_x86_x64.exe /norestart' $R1
  Delete "$TEMP\dotNetFx40_Full_x86_x64.exe"
  ${If} $R1 != 0
    MessageBox MB_OK "装程序无法检测到.NET Framework,这是必须安装的。安装程序将中止。"
    ;Abort
  ${EndIf}
  ${EndIf}
SectionEnd

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

当需要把.net打包进安装程序时(此时会大副增加安装文件体积)

Section -.NET
Call GetNetFrameworkVersion
Pop $R1
  ${If} $R1 < '3.5'
  SetDetailsPrint textonly
  DetailPrint "正在安装 .NET Framework ..."
  SetDetailsPrint listonly
  SetOutPath "$TEMP"
  SetOverwrite on
  File "C:\。。。。\安装\dotNetFx40_Full_x86_x64.exe"
  ExecWait '$TEMP\dotNetFx40_Full_x86_x64.exe /norestart' $R1
  Delete "$TEMP\dotNetFx40_Full_x86_x64.exe"
  ${If} $R1 != 0
    MessageBox MB_OK "装程序无法检测到.NET Framework,这是必须安装的。安装程序将中止。"
    ;Abort
  ${EndIf}
  ${EndIf}
SectionEnd