nsis mysql_NSIS制作安装文件全攻略(一)

; NSIS 安装脚本示例 by haijd

; 参考: http://www.yonsm.net/read.php?58

;

#=========================================================================================

; 头文件

!include "MUI.nsh"

!include "Sections.nsh"

!include "LogicLib.nsh"

#=========================================================================================

#=========================================================================================

; 宏定义

!define STR_AppName "易极OA协同办公系统"

!define STR_Version "1.0"

!define STR_Publisher "亿级空间"

!define STR_HomepageUrl "http://www.eg-oa.com"

!define REG_AppBase "Software\EgOA"

!define REG_Uninstall "Software\Microsoft\Windows\CurrentVersion\Uninstall\${STR_AppName}"

#=========================================================================================

#=========================================================================================

; MUI 设置

!define MUI_ABORTWARNING

!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\orange-install.ico"

!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\orange-uninstall.ico"

!define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"

!define MUI_UNWELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange-uninstall.bmp"

!define MUI_HEADERIMAGE

!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\orange.bmp"

!define MUI_HEADERIMAGE_UNBITMAP "${NSISDIR}\Contrib\Graphics\Header\orange-uninstall.bmp"

; 语言选择设置

!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"

!define MUI_LANGDLL_REGISTRY_KEY "${REG_Uninstall}"

!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"

; 组件页面设置

!define MUI_COMPONENTSPAGE_SMALLDESC

; 开始菜单页面设置

var STR_GroupName

var TMP_GroupName

!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"

!define MUI_STARTMENUPAGE_REGISTRY_KEY "${REG_Uninstall}"

!define MUI_STARTMENUPAGE_DEFAULTFOLDER "${STR_AppName}"

!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "NSIS:StartMenuDir"

; 完成安装页面设置

!define MUI_FINISHPAGE_RUN "C:\Program Files\Internet Explorer\iexplore.exe -new www.google.com"

!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR/help/index.html"

!define MUI_FINISHPAGE_SHOWREADME_TEXT "$(LNG_ShowHelp)"

!define MUI_FINISHPAGE_LINK "${STR_AppName} $(LNG_Homepage): ${STR_HomepageUrl}"

!define MUI_FINISHPAGE_LINK_LOCATION "${STR_HomepageUrl}"

; 安装页面

!insertmacro MUI_PAGE_WELCOME

!insertmacro MUI_PAGE_LICENSE "$(LNG_License)"

!insertmacro MUI_PAGE_DIRECTORY

!insertmacro MUI_PAGE_COMPONENTS

!insertmacro MUI_PAGE_STARTMENU Application $STR_GroupName

!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_PAGE_FINISH

; 卸载页面

!insertmacro MUI_UNPAGE_WELCOME

!insertmacro MUI_UNPAGE_CONFIRM

!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_UNPAGE_FINISH

; 语言支持

!insertmacro MUI_LANGUAGE "SimpChinese"

;!insertmacro MUI_LANGUAGE "English"

#=========================================================================================

#=========================================================================================

; 语言相关字符串

LicenseLangString LNG_License ${LANG_ENGLISH} ".\resource\EULA.txt"

LangString LNG_BrandingText ${LANG_ENGLISH} "haijd Software"

LangString LNG_DefaultInstation ${LANG_ENGLISH} "Default installtion"

LangString LNG_FullInstation ${LANG_ENGLISH} "Full installtion"

LangString LNG_MinimalInstation ${LANG_ENGLISH} "Minimal installtion"

LangString LNG_Help ${LANG_ENGLISH} "Help"

LangString LNG_Homepage ${LANG_ENGLISH} "Homepage"

LangString LNG_Uninstall ${LANG_ENGLISH} "Uninstall"

LangString LNG_ShowHelp ${LANG_ENGLISH} "Show Help"

LangString LNG_ProgramFile ${LANG_ENGLISH} "Program Files"

LangString LNG_EgOA ${LANG_ENGLISH} "Main program"

LangString LNG_ServerEnv ${LANG_ENGLISH} "Services environment."

LangString LNG_CreateShortcut ${LANG_ENGLISH} "Create Shortcut"

LangString LNG_ProgramMenuShortcutGroup ${LANG_ENGLISH} "Program Menu Shortcut Group"

LangString LNG_DesktopShortcut ${LANG_ENGLISH} "Desktop Shortcut"

LangString LNG_QuickLaunchShortcut ${LANG_ENGLISH} "Quick Launch Bar Shortcut"

LangString LNG_ProgramFileDesc ${LANG_ENGLISH} "Install ${STR_AppName} program files."

LangString LNG_EgOADesc ${LANG_ENGLISH} "Install ${STR_AppName} main program files."

LangString LNG_ServerEnvDesc ${LANG_ENGLISH} "Install ${STR_AppName} services environment."

LangString LNG_CreateShortcutDesc ${LANG_ENGLISH} "Create shortcuts to launch the program easy."

LicenseLangString LNG_License ${LANG_SIMPCHINESE} ".\resource\EULA.txt"

LangString LNG_BrandingText ${LANG_SIMPCHINESE} "haijd Software"

LangString LNG_DefaultInstation ${LANG_SIMPCHINESE} "默认安装"

LangString LNG_FullInstation ${LANG_SIMPCHINESE} "完全安装"

LangString LNG_MinimalInstation ${LANG_SIMPCHINESE} "最小安装"

LangString LNG_Help ${LANG_SIMPCHINESE} "帮助"

LangString LNG_Homepage ${LANG_SIMPCHINESE} "主页"

LangString LNG_Uninstall ${LANG_SIMPCHINESE} "卸载"

LangString LNG_ShowHelp ${LANG_SIMPCHINESE} "查看帮助"

LangString LNG_ProgramFile ${LANG_SIMPCHINESE} "程序文件"

LangString LNG_EgOA ${LANG_SIMPCHINESE} "主程序"

LangString LNG_ServerEnv ${LANG_SIMPCHINESE} "服务环境"

LangString LNG_CreateShortcut ${LANG_SIMPCHINESE} "创建快捷方式"

LangString LNG_ProgramMenuShortcutGroup ${LANG_SIMPCHINESE} "程序菜单快捷方式组"

LangString LNG_DesktopShortcut ${LANG_SIMPCHINESE} "桌面快捷方式"

LangString LNG_QuickLaunchShortcut ${LANG_SIMPCHINESE} "快速启动栏快捷方式"

LangString LNG_ProgramFileDesc ${LANG_SIMPCHINESE} "安装 ${STR_AppName} 程序文件。"

LangString LNG_EgOADesc ${LANG_SIMPCHINESE} "安装 ${STR_AppName} 主程序文件"

LangString LNG_ServerEnvDesc ${LANG_SIMPCHINESE} "安装 ${STR_AppName} 服务环境"

LangString LNG_CreateShortcutDesc ${LANG_SIMPCHINESE} "创建用于快速访问的快捷方式。"

#=========================================================================================

#=========================================================================================

; 杂项

Name "${STR_AppName} ${STR_Version}"

OutFile "${STR_AppName}_${STR_Version}.exe"

InstallDir "$PROGRAMFILES\egoa"

InstallDirRegKey HKCU "${REG_AppBase}" "InstallDir"

ShowInstDetails SHOW

ShowUnInstDetails SHOW

BrandingText "$(LNG_BrandingText)"

#=========================================================================================

#=========================================================================================

; 安装类型

!ifndef NOINSTTYPES

InstType "$(LNG_DefaultInstation)"

InstType "$(LNG_FullInstation)"

InstType "$(LNG_MinimalInstation)"

!endif

#=========================================================================================

#=========================================================================================

; 程序文件

Section

LogSet on

SectionEnd

SectionGroup /e "$(LNG_ProgramFile)" SEC_ProgramFile

Section "$(LNG_EgOA)" SEC_EgOA

SectionIn 1 2 3 RO

SetOverwrite ON

SetOutPath "$INSTDIR"

File ".\resource\egoa.ico"

File /r ".\resource\program"

SectionEnd

Section "$(LNG_ServerEnv)" SEC_ServerEnv

SectionIn 1 2 3 RO

SetOutPath "$INSTDIR"

File /r ".\resource\server"

File /r ".\resource\database"

SectionEnd

Section "$(LNG_Help)" SEC_Help

SectionIn 1 2

SetOutPath "$INSTDIR"

File /r ".\resource\help"

SectionEnd

SectionGroupEnd

#=========================================================================================

#=========================================================================================

; 快捷方式

SectionGroup "$(LNG_CreateShortcut)" SEC_Shortcut

; 创建开始菜单程序组

SectionGroup "$(LNG_ProgramMenuShortcutGroup)" SEC_ProgramMenuShortcutGroup

Section "${STR_AppName}" SEC_AppNameShortcut

SectionIn 1 2

CreateDirectory "$SMPROGRAMS\$STR_GroupName"

WriteINIStr "$SMPROGRAMS\$STR_GroupName\${STR_AppName}.url" "InternetShortcut" "URL" "$INSTDIR/program/www/index.html"

SectionEnd

Section "${STR_AppName} $(LNG_Help)" SEC_HelpShortcut

SectionIn 1 2

CreateDirectory "$SMPROGRAMS\$STR_GroupName"

WriteINIStr "$SMPROGRAMS\$STR_GroupName\${STR_AppName} $(LNG_Help).url" "InternetShortcut" "URL" "$INSTDIR/program/www/help/index.html"

SectionEnd

Section "${STR_AppName} $(LNG_Homepage)" SEC_HomePageShortcut

SectionIn 1 2

CreateDirectory "$SMPROGRAMS\$STR_GroupName"

WriteINIStr "$SMPROGRAMS\$STR_GroupName\${STR_AppName} $(LNG_Homepage).url" "InternetShortcut" "URL" "${STR_HomepageUrl}"

SectionEnd

Section "$(LNG_Uninstall) ${STR_AppName}" SEC_UninstallShortcut

SectionIn 1 2

CreateDirectory "$SMPROGRAMS\$STR_GroupName"

CreateShortCut "$SMPROGRAMS\$STR_GroupName\$(LNG_Uninstall) ${STR_AppName}.lnk" "$INSTDIR\Uninstall.exe"

SectionEnd

SectionGroupEnd

; 桌面

Section "$(LNG_DesktopShortcut)" SEC_DesktopShortcut

SectionIn 1 2

WriteINIStr "$DESKTOP\${STR_AppName}.url" "InternetShortcut" "URL" "http://127.0.0.1/"

SectionEnd

; 快速启动

Section "$(LNG_QuickLaunchShortcut)" SEC_QuickLaunchShortcut

SectionIn 2

WriteINIStr "$QUICKLAUNCH\${STR_AppName}.url" "InternetShortcut" "URL" "http://127.0.0.1/"

SectionEnd

SectionGroupEnd

#=========================================================================================

#=========================================================================================

# 替换文件内容用的宏

!macro ReplaceConfig FileName StringOld StringNew

Push `${StringOld}` #text to be replaced

Push `${StringNew}` #replace with

Push all #replace all occurrences

Push all #replace all occurrences

Push `${FileName}` #file to replace in

Call AdvReplaceInFile

!macroend

#=========================================================================================

#=========================================================================================

; 配置服务

Section "-SettingServer"

; 修改配置文件

!insertmacro ReplaceConfig "$INSTDIR\server\Apache2.2\conf\httpd.conf" "EGOA_BASE_PATH" "$INSTDIR"

!insertmacro ReplaceConfig "$INSTDIR\server\MySQL4.1\my.ini" "EGOA_BASE_PATH" "$INSTDIR"

!insertmacro ReplaceConfig "$INSTDIR\server\php5\php.ini" "EGOA_BASE_PATH" "$INSTDIR"

; 创建服务

nsExec::ExecToLog '"$INSTDIR\server\MySQL4.1\bin\mysqld-nt.exe" --install MySQL4.1 --defaults-file="$INSTDIR\server\MySQL4.1\my.ini"'

nsExec::ExecToLog '"$INSTDIR\server\Apache2.2\bin\httpd.exe" -k install'

; 启动服务

nsExec::ExecToLog 'net start MySQL4.1'

nsExec::ExecToLog 'net start Apache2.2'

SectionEnd

#=========================================================================================

#=========================================================================================

; 完成安装

Section "-PostInstall"

; 输出卸载程序

WriteUninstaller "$INSTDIR\Uninstall.exe"

; 写注册表

WriteRegStr HKCU "${REG_AppBase}" "InstallDir" "$INSTDIR" ; 安装的目录

WriteRegStr HKCU "${REG_AppBase}" "GroupName" "$STR_GroupName" ; 软件在开始菜单中的名称

WriteRegStr HKCU "${REG_AppBase}" "Version" "${STR_Version}" ; 版本号

WriteRegStr HKCU "${REG_Uninstall}" "DisplayName" "$(^Name)"

WriteRegStr HKCU "${REG_Uninstall}" "UninstallString" "$INSTDIR\Uninstall.exe"

WriteRegStr HKCU "${REG_Uninstall}" "DisplayIcon" "$INSTDIR\EgOA.ico"

WriteRegStr HKCU "${REG_Uninstall}" "DisplayVersion" "${STR_Version}"

WriteRegStr HKCU "${REG_Uninstall}" "URLInfoAbout" "${STR_HomepageUrl}"

WriteRegStr HKCU "${REG_Uninstall}" "Publisher" "${STR_Publisher}"

SectionEnd

#=========================================================================================

#=========================================================================================

; 初始化回调函数

Function .onInit

!insertmacro MUI_LANGDLL_DISPLAY

; 判断是否已安装

Var /GLOBAL OLD_REG_Version

ReadRegStr $OLD_REG_Version "HKCU" "${REG_APPBASE}" "Version"

${If} $OLD_REG_Version <> ''

Abort '系统中已安装有本程序,请先卸载后再安装!'

${EndIf}

FunctionEnd

#=========================================================================================

#=========================================================================================

# 替换文件中的字符串

Function AdvReplaceInFile

Exch $0 ;file to replace in

Exch

Exch $1 ;number to replace after

Exch

Exch 2

Exch $2 ;replace and onwards

Exch 2

Exch 3

Exch $3 ;replace with

Exch 3

Exch 4

Exch $4 ;to replace

Exch 4

Push $5 ;minus count

Push $6 ;universal

Push $7 ;end string

Push $8 ;left string

Push $9 ;right string

Push $R0 ;file1

Push $R1 ;file2

Push $R2 ;read

Push $R3 ;universal

Push $R4 ;count (onwards)

Push $R5 ;count (after)

Push $R6 ;temp file name

GetTempFileName $R6

FileOpen $R1 $0 r ;file to search in

FileOpen $R0 $R6 w ;temp file

StrLen $R3 $4

StrCpy $R4 -1

StrCpy $R5 -1

loop_read:

ClearErrors

FileRead $R1 $R2 ;read line

IfErrors exit

StrCpy $5 0

StrCpy $7 $R2

loop_filter:

IntOp $5 $5 - 1

StrCpy $6 $7 $R3 $5 ;search

StrCmp $6 "" file_write2

StrCmp $6 $4 0 loop_filter

StrCpy $8 $7 $5 ;left part

IntOp $6 $5 + $R3

IntCmp $6 0 is0 not0

is0:

StrCpy $9 ""

Goto done

not0:

StrCpy $9 $7 "" $6 ;right part

done:

StrCpy $7 $8$3$9 ;re-join

IntOp $R4 $R4 + 1

StrCmp $2 all file_write1

StrCmp $R4 $2 0 file_write2

IntOp $R4 $R4 - 1

IntOp $R5 $R5 + 1

StrCmp $1 all file_write1

StrCmp $R5 $1 0 file_write1

IntOp $R5 $R5 - 1

Goto file_write2

file_write1:

FileWrite $R0 $7 ;write modified line

Goto loop_read

file_write2:

FileWrite $R0 $R2 ;write unmodified line

Goto loop_read

exit:

FileClose $R0

FileClose $R1

SetDetailsPrint none

Delete $0

Rename $R6 $0

Delete $R6

SetDetailsPrint both

Pop $R6

Pop $R5

Pop $R4

Pop $R3

Pop $R2

Pop $R1

Pop $R0

Pop $9

Pop $8

Pop $7

Pop $6

Pop $5

Pop $0

Pop $1

Pop $2

Pop $3

Pop $4

FunctionEnd

#=========================================================================================

#=========================================================================================

# 根据安装日志卸载文件的调用宏

!macro DelFileByLog LogFile

ifFileExists `${LogFile}` 0 +4

Push `${LogFile}`

Call un.DelFileByLog

Delete `${LogFile}`

!macroend

#=========================================================================================

#=========================================================================================

; 卸载

Section "Uninstall"

; 停止服务

nsExec::ExecToLog 'net stop Apache2.2'

nsExec::ExecToLog 'net stop MySQL4.1'

; 卸载服务

nsExec::ExecToLog '"$INSTDIR\server\MySQL4.1\bin\mysqld-nt.exe" --remove MySQL4.1'

nsExec::ExecToLog '"$INSTDIR\server\Apache2.2\bin\httpd.exe" -k uninstall'

; 从注册表中取得软件在开始菜单中的名称

ReadRegStr $TMP_GroupName HKCU "${REG_AppBase}" "GroupName"

; 删除开始菜单中的快捷方式与目录

Delete "$SMPROGRAMS\$TMP_GroupName\${STR_AppName}.url"

Delete "$SMPROGRAMS\$TMP_GroupName\${STR_AppName} $(LNG_Help).url"

Delete "$SMPROGRAMS\$TMP_GroupName\${STR_AppName} $(LNG_Homepage).url"

Delete "$SMPROGRAMS\$TMP_GroupName\$(LNG_Uninstall) ${STR_AppName}.lnk"

RMDir "$SMPROGRAMS\$TMP_GroupName"

Delete /REBOOTOK "$DESKTOP\${STR_AppName}.url" ; 删除桌面快捷方式

Delete /REBOOTOK "$QUICKLAUNCH\${STR_AppName}.url" ; 删除快速启动快捷方式

; 调用宏根据安装日志卸载安装程序自己安装过的文件

!insertmacro DelFileByLog "$INSTDIR\install.log"

; 删除安装目录中的文件

RMDir "$INSTDIR"

RMDir "$INSTDIR\help"

RMDir "$INSTDIR\program"

RMDir /r /REBOOTOK "$INSTDIR\server"

RMDir /r /REBOOTOK "$INSTDIR\help"

; 删除注册表内容

DeleteRegKey HKCU "${REG_Uninstall}"

DeleteRegKey HKCU "${REG_AppBase}"

SetAutoClose True

SectionEnd

#=========================================================================================

#=========================================================================================

; 卸载初始化

Function un.onInit

!insertmacro MUI_UNGETLANGUAGE

FunctionEnd

#=========================================================================================

#=========================================================================================

# 卸载程序通过安装日志卸载文件函数

Function un.DelFileByLog

Exch $R0

Push $R1

Push $R2

Push $R3

FileOpen $R0 $R0 r

${Do}

FileRead $R0 $R1

${IfThen} $R1 == `` ${|} ${ExitDo} ${|}

StrCpy $R1 $R1 -2

StrCpy $R2 $R1 11

StrCpy $R3 $R1 20

${If} $R2 == "File: wrote"

${OrIf} $R2 == "File: skipp"

${OrIf} $R3 == "CreateShortCut: out:"

${OrIf} $R3 == "created uninstaller:"

Push $R1

Push `"`

Call un.DelFileByLog.StrLoc

Pop $R2

${If} $R2 != ""

IntOp $R2 $R2 + 1

StrCpy $R3 $R1 "" $R2

Push $R3

Push `"`

Call un.DelFileByLog.StrLoc

Pop $R2

${If} $R2 != ""

StrCpy $R3 $R3 $R2

Delete /REBOOTOK $R3

${EndIf}

${EndIf}

${EndIf}

StrCpy $R2 $R1 7

${If} $R2 == "Rename:"

Push $R1

Push "->"

Call un.DelFileByLog.StrLoc

Pop $R2

${If} $R2 != ""

IntOp $R2 $R2 + 2

StrCpy $R3 $R1 "" $R2

Delete /REBOOTOK $R3

${EndIf}

${EndIf}

${Loop}

FileClose $R0

Pop $R3

Pop $R2

Pop $R1

Pop $R0

FunctionEnd

Function un.DelFileByLog.StrLoc

Exch $R0

Exch

Exch $R1

Push $R2

Push $R3

Push $R4

Push $R5

StrLen $R2 $R0

StrLen $R3 $R1

StrCpy $R4 0

${Do}

StrCpy $R5 $R1 $R2 $R4

${If} $R5 == $R0

${OrIf} $R4 = $R3

${ExitDo}

${EndIf}

IntOp $R4 $R4 + 1

${Loop}

${If} $R4 = $R3

StrCpy $R0 ""

${Else}

StrCpy $R0 $R4

${EndIf}

Pop $R5

Pop $R4

Pop $R3

Pop $R2

Pop $R1

Exch $R0

FunctionEnd

#=========================================================================================

#=========================================================================================

# 节描述

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN

!insertmacro MUI_DESCRIPTION_TEXT ${SEC_ProgramFile} "$(LNG_ProgramFileDesc)"

!insertmacro MUI_DESCRIPTION_TEXT ${SEC_EgOA} "$(LNG_EgOADesc)"

!insertmacro MUI_DESCRIPTION_TEXT ${SEC_ServerEnv} "$(LNG_ServerEnvDesc)"

!insertmacro MUI_DESCRIPTION_TEXT ${SEC_Shortcut} "$(LNG_CreateShortcutDesc)"

!insertmacro MUI_DESCRIPTION_TEXT ${SEC_DesktopShortcut} "$(LNG_CreateShortcutDesc)"

!insertmacro MUI_DESCRIPTION_TEXT ${SEC_QuickLaunchShortcut} "$(LNG_CreateShortcutDesc)"

!insertmacro MUI_DESCRIPTION_TEXT ${SEC_AppNameShortcut} "$(LNG_CreateShortcutDesc)"

!insertmacro MUI_DESCRIPTION_TEXT ${SEC_HelpShortcut} "$(LNG_CreateShortcutDesc)"

!insertmacro MUI_DESCRIPTION_TEXT ${SEC_HomePageShortcut} "$(LNG_CreateShortcutDesc)"

!insertmacro MUI_DESCRIPTION_TEXT ${SEC_UninstallShortcut} "$(LNG_CreateShortcutDesc)"

!insertmacro MUI_FUNCTION_DESCRIPTION_END

#=========================================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值