nsi文件例子如下
;NSIS Modern User Interface
;Basic Example Script
;Written by Joost Verburg
!Define Product "MySoft"
!Define NAME_JP "我的软件"
!Define Company "俺公司"
!Define Version "1.0.0"
!Define LocalMtExpertsDir "C:\Program Files (x86)\MetaTrader 4"
!Define ROOT ".........\Release\"
!Define RegUninstall "Software\Microsoft\Windows\CurrentVersion\Uninstall\${Product}"
;--------------------------------
;Include Modern UI
!include "MUI.nsh"
;--------------------------------
;General
;Name and file
Name "${NAME_JP}"
OutFile "${Product}_${Version}_setup.exe"
;Default installation folder
InstallDir "$PROGRAMFILES\${Company}\${Product}"
;Get installation folder from registry if available
InstallDirRegKey HKCU "Software\${Company}\${Product}" ""
;--------------------------------
;Variables
Var MUI_TEMP
Var STARTMENU_FOLDER
Var MT_DIR
Var MT_DIR_CTRL
;--------------------------------
;Interface Settings
!define MUI_ABORTWARNING
Function setChooseMtArea
!insertmacro MUI_HEADER_TEXT "MetaTrader 4的文件夹" "请选择MetaTrader 4所在的文件夹。"
!insertmacro MUI_INSTALLOPTIONS_WRITE "mt4dir.ini" "Field 2" "State" "$PROGRAMFILES\Metatrader 4"
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "mt4dir.ini"
FunctionEnd
Function setChooseMtAreaLeave
!insertmacro MUI_INSTALLOPTIONS_READ $MT_DIR_CTRL "mt4dir.ini" "Field 2" "HWND"
!insertmacro MUI_INSTALLOPTIONS_READ $MT_DIR "mt4dir.ini" "Field 2" "State"
recheck:
${If} $MT_DIR == ""
MessageBox MB_OK "MetaTrader 4のフォルダーを選択してください。"
Abort
${Else}
IfFileExists $MT_DIR\experts\*.* 0 +2
goto skip
MessageBox MB_OKCANCEL "所选文件夹中未找到MetaTrader 4。$\n需要为您安装MetaTrader 4吗?" IDCANCEL +6
SetOutPath "$TEMP"
File "${ROOT}mt4setup.exe"
ExecWait '"$TEMP\mt4setup.exe" '
Delete "$TEMP\mt4setup.exe"
goto recheck
Abort
skip:
${EndIf}
FunctionEnd
;--------------------------------
;Pages
!insertmacro MUI_PAGE_LICENSE "${ROOT}License.txt"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
Page custom setChooseMtArea setChooseMtAreaLeave ""
;Start Menu Folder Page Configuration
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\${Company}\${Product}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
!insertmacro MUI_PAGE_STARTMENU ${Product} $STARTMENU_FOLDER
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\${Product}.exe"
;Exec "$INSTDIR\${Product}.exe /regserver"
!define MUI_FINISHPAGE_RUN_NOTCHECKED
!insertmacro MUI_PAGE_FINISH
;--------------------------------
;Languages
!insertmacro MUI_LANGUAGE "Japanese"
;!insertmacro MUI_LANGUAGE "English"
RequestExecutionLevel admin
;--------------------------------
;Installer Sections
Section ${NAME_JP} SecDummy
SetShellVarContext all
ReadRegStr $4 HKEY_LOCAL_MACHINE \
"Software\Microsoft\NET Framework Setup\NDP\v3.5" "SP"
STRCMP $4 1 SKIP NOSKIP
; Exec "$INSTDIR\${Product}.exe /regserver"
; abort
NOSKIP:
MESSAGEBOX mb_ok "本产品需要Microsoft .NET Framework 3.5 SP1或以后的版本支持。"
NSISdl::download /TIMEOUT=30000 "http://download.microsoft.com/download/0/6/1/061F001C-8752-4600-A198-53214C69B51F/dotnetfx35setup.exe" "$TEMP\dotNetFx35setup.exe"
ExecWait '"$TEMP\dotNetFx35setup.exe" '
;Delete "$TEMP\dotNetFx35setup.exe"
SKIP:
SetOutPath "$INSTDIR"
File /oname=${Product}.exe "${ROOT}${Product}.exe"
File "${ROOT}*.dll"
File "${ROOT}${Product}.exe.config"
File "${ROOT}XXX2.ico"
File "${LocalMtExpertsDir}\experts\libraries\XXX.dll"
File "${LocalMtExpertsDir}\experts\indicators\XXX.ex4"
File "${LocalMtExpertsDir}\experts\scripts\XXX.ex4"
SetOutPath "$INSTDIR\Sound"
File "${ROOT}Sound\*.wav"
SetOutPath "$INSTDIR\Help"
File "${ROOT}Help\*.chm"
SetOutPath "$MT_DIR"
File "${LocalMtExpertsDir}\XXX.dll"
File "${LocalMtExpertsDir}\Fann.Net.dll"
File "${ROOT}fanndoubleMT.dll"
File "${ROOT}System.Windows.Forms.DataVisualization.dll"
SetOutPath "$MT_DIR\experts\indicators"
File "${LocalMtExpertsDir}\experts\indicators\XXX.ex4"
SetOutPath "$MT_DIR\experts\scripts"
File "${LocalMtExpertsDir}\experts\scripts\XXX.ex4"
SetOutPath "$MT_DIR\experts\libraries"
File "${LocalMtExpertsDir}\experts\libraries\XXX.dll"
;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
WriteRegStr HKLM "${RegUninstall}" "DisplayName" ${NAME_JP}
WriteRegStr HKLM "${RegUninstall}" "UninstallString" "$INSTDIR\Uninstall.exe"
WriteRegStr HKLM "${RegUninstall}" "HelpLink" "http://www.internal.co.jp/support/"
WriteRegDWORD HKLM "${RegUninstall}" "NoModify" 1
WriteRegDWORD HKLM "${RegUninstall}" "NoRepair" 1
WriteRegStr HKLM "${RegUninstall}" "MtDir" "$MT_DIR"
WriteRegStr HKLM "${RegUninstall}" "MainDir" "$INSTDIR"
WriteRegStr HKCR ".xxx" "" "XXX.file"
WriteRegStr HKCR "XXX.file" "" "XXXファイル (.xxx)"
WriteRegStr HKCR "XXX.file\DefaultIcon" "" "$INSTDIR\XXX.ico"
WriteRegStr HKCR "XXX.file\shell" "" ""
WriteRegStr HKCR "XXX.file\shell\open" "" ""
WriteRegStr HKCR "XXX.file\shell\open\command" "" '"$INSTDIR\${Product}.exe" "%1"'
!insertmacro MUI_STARTMENU_WRITE_BEGIN ${Product}
SetOutPath "$INSTDIR"
CreateShortCut "$DESKTOP\${NAME_JP}.lnk" "$INSTDIR\${Product}.exe"
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\${NAME_JP}.lnk" "$INSTDIR\${Product}.exe"
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\uninstall.lnk" "$INSTDIR\Uninstall.exe"
!insertmacro MUI_STARTMENU_WRITE_END
System::Call 'shell32.dll::SHChangeNotify(l, l, i, i) v (0x08000000, 0, 0, 0)'
SectionEnd
;--------------------------------
;Descriptions
;Language strings
LangString DESC_SecDummy ${LANG_ENGLISH} "${NAME_JP} 执行程序。"
;LangString DESC_SecDummy ${LANG_ENGLISH} "This is ${NAME_JP}."
;Assign language strings to sections
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy)
!insertmacro MUI_FUNCTION_DESCRIPTION_END
;--------------------------------
;Uninstaller Section
Section "Uninstall"
SetShellVarContext all
;ADD YOUR OWN FILES HERE..
ReadRegStr $MT_DIR HKLM "${RegUninstall}" "MtDir"
Delete "$INSTDIR\Uninstall.exe"
Delete "$INSTDIR\${Product}.exe"
Delete "$INSTDIR\*.ico"
Delete "$INSTDIR\*.config"
Delete "$INSTDIR\*.dll"
Delete "$INSTDIR\*.ini"
Delete "$INSTDIR\*.log"
Delete "$INSTDIR\*.wav"
Delete "$INSTDIR\*.db"
Delete "$INSTDIR\*.xxx"
Delete "$INSTDIR\*.chm"
Delete "$INSTDIR\Help\*.chm"
Delete "$INSTDIR\Sound\*.wav"
Delete "$INSTDIR\Models\*.xxx"
Delete "$INSTDIR\Models\NetResults\*.xxx"
Delete "$MT_DIR\experts\libraries\XXX.dll"
Delete "$MT_DIR\experts\scripts\XXX.ex4"
Delete "$MT_DIR\experts\indicators\XXX.ex4"
Delete "$MT_DIR\XXXX.dll"
Delete "$MT_DIR\Fann.Net.dll"
Delete "$MT_DIR\fanndoubleMT.dll"
Delete "$MT_DIR\System.Windows.Forms.DataVisualization.dll"
!insertmacro MUI_STARTMENU_GETFOLDER ${Product} $MUI_TEMP
Delete "$DESKTOP\${NAME_JP}.lnk"
Delete "$SMPROGRAMS\$MUI_TEMP\*.lnk"
RMDir "$SMPROGRAMS\$MUI_TEMP"
RMDir "$INSTDIR\Help"
RMDir "$INSTDIR\Sound"
RMDir "$INSTDIR\Models\NetResults"
RMDir "$INSTDIR\Models"
RMDir "$INSTDIR"
DeleteRegKey HKCR ".xxx"
DeleteRegKey HKCR "XXX.file"
DeleteRegKey HKLM "${RegUninstall}"
System::Call 'shell32.dll::SHChangeNotify(l, l, i, i) v (0x08000000, 0, 0, 0)'
SectionEnd
;Function .onInstSuccess
;Exec "$INSTDIR\${Product}.exe /regserver"
;FunctionEnd
Function .onInit
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "mt4dir.ini"
ReadRegStr $0 HKLM "${RegUninstall}" "DisplayName"
StrCmp $0 "" noabort3
MessageBox MB_OK "${NAME_JP}已经安装,请先卸载。"
;MessageBox MB_OK "${NAME_JP} has already been installed. Please uninstall the programm and restart the install procedure."
Abort ; causes installer to quit.
noabort3:
FunctionEnd
Function un.onInit
Push $R0
CheckProc:
Push "${Product}.exe"
ProcessWork::existsprocess
Pop $R0
IntCmp $R0 0 GetDir
MessageBox MB_OKCANCEL|MB_ICONSTOP "${NAME_JP}正在运行。$\r$\n${NAME_JP}强制结束吗?" IDCANCEL abort
Push "${Product}.exe"
Processwork::KillProcess
Sleep 1000
goto CheckProc
abort:
Abort
GetDir:
FunctionEnd
Icon "${ROOT}Setup.ico"
UninstallIcon "${ROOT}Setup.ico"
这个过程中,加入了一个自定义的页面选择Metatrader所在的文件夹。除了上述代码外,还需要一个描述页面用的ini文件(通过NSIS图形工具制作)
; Ini file generated by the HM NIS Edit IO designer.
[Settings]
NumFields=3
[Field 1]
Type=Label
Text=Metatrader4的文件夹:
Left=10
Right=80
Top=26
Bottom=34
[Field 2]
Type=DirRequest
State=DirRequest
Left=80
Right=270
Top=22
Bottom=36
[Field 3]
Type=Label
Text=本软件在Metatrader 4的基础上运行。请选择Metatrader 4所在的文件夹。
Left=10
Right=273
Top=3
Bottom=19
随后,可通过批处理文件对dll进行签名(未签名的dll可能被视为带威胁性软件),创建安装包
@echo on
set version=1.0.0
set pfxDir=c:\
set nsisDir=C:\Program Files (x86)\NSIS\
set signtoolDir=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\
set dllRoot=.......\Release\
set installerFolder=......\Installer\
set releaseFolder=\\server\MySoft\
"%signtoolDir%signtool.exe" sign /du http://www.mycompany.com /t http://timestamp.verisign.com/scripts/timstamp.dll /f %pfxDir%mycredit.pfx /v %dllRoot%MySoft.exe
"%signtoolDir%signtool.exe" sign /du http://www.mycompany.com /t http://timestamp.verisign.com/scripts/timstamp.dll /f %pfxDir%mycredit.pfx /v %dllRoot%XXX1.dll
"%signtoolDir%signtool.exe" sign /du http://www.mycompany.com /t http://timestamp.verisign.com/scripts/timstamp.dll /f %pfxDir%mycredit.pfx /v %dllRoot%XXX2.dll
"%nsis%makensis" %installerFolder%Setup.nsi
copy "%installerFolder%MySoft_%version%_setup.exe" "%releaseFolder%"
pause
@echo off
双击执行,即可完成创建安装包,并上传至服务器。