二、簡單的NSIS安裝包


新建腳本:向導

我們先從一個簡單的NSIS安裝包開始吧,就像前面(NSIS介紹)所說,我們雖然看過用戶手冊,可要寫安裝腳本無從下手,那我們的編輯工具HM NIS Edit就派上用場了。

打開HM NIS Edit,點擊菜單“文件”->“新建腳本:向導”,會有向導一步步讓我們輸入信息,最后根據我們的輸入生成.nsi腳本文件,下面我們一步步演示:

 

新建腳本:腳本文件
最后生成的腳本文件我們保存為MyApp.nsi,打開查看腳本(對照着上面截圖中設置的項再配合用戶手冊查看,你會知道一個完整的腳本文件的基本結構和基本的指令用法)
; Script generated by the HM NIS Edit Script Wizard.

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "My application"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

; MUI 1.67 compatible ------
!include "MUI.nsh"

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "E:\ZZL\ADWeb\安裝包制作\Licence.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE "SimpChinese"

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Setup.exe"
InstallDir "$PROGRAMFILES\My application"
ShowInstDetails show
ShowUnInstDetails show

Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite try
  File "E:\ZZL\ADWeb\安裝包制作\Release\404.aspx"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Default.aspx"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Error.aspx"
  SetOutPath "$INSTDIR\Images"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Images\1_close.png"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Images\1_open.png"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Images\add.png"
  SetOutPath "$INSTDIR\Scripts"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Scripts\CommonScript.js"
  SetOutPath "$INSTDIR\SystemLog"
  File "E:\ZZL\ADWeb\安裝包制作\Release\SystemLog\LogStatisticsDetail.aspx"
  File "E:\ZZL\ADWeb\安裝包制作\Release\SystemLog\SystemLogList.aspx"
  File "E:\ZZL\ADWeb\安裝包制作\Release\SystemLog\SystemLogStatistics.aspx"
  SetOutPath "$INSTDIR"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Web.config"
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.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}" "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\uninst.exe"
  Delete "$INSTDIR\Web.config"
  Delete "$INSTDIR\SystemLog\SystemLogStatistics.aspx"
  Delete "$INSTDIR\SystemLog\SystemLogList.aspx"
  Delete "$INSTDIR\SystemLog\LogStatisticsDetail.aspx"
  Delete "$INSTDIR\Scripts\CommonScript.js"
  Delete "$INSTDIR\Images\add.png"
  Delete "$INSTDIR\Images\1_open.png"
  Delete "$INSTDIR\Images\1_close.png"
  Delete "$INSTDIR\Error.aspx"
  Delete "$INSTDIR\Default.aspx"
  Delete "$INSTDIR\404.aspx"

  RMDir "$INSTDIR\SystemLog"
  RMDir "$INSTDIR\Scripts"
  RMDir "$INSTDIR\Images"
  RMDir "$INSTDIR"

  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd

值得注意的是,從新建腳本向導的第三步有選項用戶圖形界面我們默認選擇的是“現代”,對應腳本中引入了NSIS現代用戶界面頭文件(!include "MUI.nsh"),對應的安裝頁面中都是以!insertmacro MUI_PAGE_***開頭(如:歡迎頁面!insertmacro MUI_PAGE_WELCOME),詳細的說明請查看NSIS Modern User Interface

安裝包:現代界面

下面我們看下安裝包的效果,在HM NIS Edit界面,點擊菜單“NSIS”->“編譯並運行”,輸出窗口會顯示編譯過程,如果沒有出錯,會直接執行編譯生成的Setup.exe,安裝截圖如下:

從上面截圖可以看到我們的安裝包共有5個用戶界面,這個和腳本文件中是對應的:

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "E:\ZZL\ADWeb\安裝包制作\Licence.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH

其中“安裝記錄頁面”將實際執行安裝區段中的指令,這些指令可以解壓文件讀取,讀寫注冊表、INI文件或普通文件,執行Powershell腳本,創建目錄,創建快捷方式等等。如果一個安裝程序有多個組件,每個組件都有它自己的代碼塊,當用戶選擇了安裝該組件,那么安裝程序就會執行對應的代碼,那么每個組件就需要對應一個區段,具體關於可選組件的信息會在以后章節介紹。我們目前只有一個安裝區段,是把部署包文件放入安裝目錄:

Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite try
  File "E:\ZZL\ADWeb\安裝包制作\Release\404.aspx"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Default.aspx"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Error.aspx"
  SetOutPath "$INSTDIR\Images"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Images\1_close.png"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Images\1_open.png"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Images\add.png"
  Sleep 20000
  SetOutPath "$INSTDIR\Scripts"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Scripts\CommonScript.js"
  SetOutPath "$INSTDIR\SystemLog"
  File "E:\ZZL\ADWeb\安裝包制作\Release\SystemLog\LogStatisticsDetail.aspx"
  File "E:\ZZL\ADWeb\安裝包制作\Release\SystemLog\SystemLogList.aspx"
  File "E:\ZZL\ADWeb\安裝包制作\Release\SystemLog\SystemLogStatistics.aspx"
  SetOutPath "$INSTDIR"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Web.config"
SectionEnd

關於界面上的信息都是我們在腳本向導中設置的(如應用程序名稱、版本、公司、圖標、授權信息、語言等),可以在腳本中修改:

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "My application"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

; MUI 1.67 compatible ------
!include "MUI.nsh"

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

還有一些是關於安裝包本身的信息(如:名稱、默認安裝路徑、生成安裝包名稱、是否顯示安裝詳情等):

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Setup.exe"
InstallDir "$PROGRAMFILES\ADWebManager"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show
BrandingText " MyCompany Ltd."

其中注意加一行命令BrandingText " Prolliance Ltd.",這樣用戶安裝界面中就不是NSIS的信息了,前后對比如下:

 

修改腳本:標准界面

上面我們使用HM NIS Edit的向導創建了具有“現代界面”的安裝包,其中腳本文件中引入了NSIS現代用戶界面頭文件(!include "MUI.nsh"),現在我們不要引入額外的頭文件,改成NSIS標准的界面試試,就像我們查看用戶手冊看到的,我們可以通過Page命令(或更多高級設置如PageEx)。我們修改后的腳本文件如下:

 

; Script generated by the HM NIS Edit Script Wizard.

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "My application"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

; pages
PageEx license
       LicenseText "許可頁面"
       LicenseData "E:\ZZL\ADWeb\安裝包制作\Licence.txt"
       ;LicenseForceSelection
PageExEnd
PageEx directory
       DirText "目錄選擇頁面" "目標文件夾" "瀏覽..."
PageExEnd
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Setup.exe"
InstallDir "$PROGRAMFILES\My application"
ShowInstDetails show
ShowUnInstDetails show
BrandingText " MyCompany Ltd."

Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite try
  File "E:\ZZL\ADWeb\安裝包制作\Release\404.aspx"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Default.aspx"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Error.aspx"
  SetOutPath "$INSTDIR\Images"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Images\1_close.png"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Images\1_open.png"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Images\add.png"
  Sleep 20000
  SetOutPath "$INSTDIR\Scripts"
  File "E:\ZZL\ADWeb\安裝包制作\Release\Scripts\CommonScript.js"
  SetOutPath "$INSTDIR\SystemLog"
  File "E:\ZZL\ADWeb\安裝包制作\Release\SystemLog\LogStatisticsDetail.aspx"
  File "E:\ZZL\ADWeb\安裝包制作\Release\SystemLog\SystemLogList.aspx"
  File "E:\ZZL\ADWeb\安裝包制作\Release\SystemLog\SystemLogStatistics.aspx"
  SetOutPath "$INSTDIR"
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.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}" "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\uninst.exe"
  Delete "$INSTDIR\Web.config"
  Delete "$INSTDIR\SystemLog\SystemLogStatistics.aspx"
  Delete "$INSTDIR\SystemLog\SystemLogList.aspx"
  Delete "$INSTDIR\SystemLog\LogStatisticsDetail.aspx"
  Delete "$INSTDIR\Scripts\CommonScript.js"
  Delete "$INSTDIR\Images\add.png"
  Delete "$INSTDIR\Images\1_open.png"
  Delete "$INSTDIR\Images\1_close.png"
  Delete "$INSTDIR\Error.aspx"
  Delete "$INSTDIR\Default.aspx"
  Delete "$INSTDIR\404.aspx"

  RMDir "$INSTDIR\SystemLog"
  RMDir "$INSTDIR\Scripts"
  RMDir "$INSTDIR\Images"
  RMDir "$INSTDIR"

  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd

 

安裝包:標准界面

下面我們看下標准界面的腳本生成的安裝包效果,執行后在HM NIS Edit界面,點擊菜單“NSIS”->“編譯並運行”,輸出窗口會顯示編譯過程,如果沒有出錯,會直接執行編譯生成的Setup.exe,安裝截圖如下:

是不是比較起來“現代用戶界面”,標准的界面會很丑,而且NSIS內置的標准安裝界面沒有歡迎、完成界面(只有許可、目錄選擇、組件、安裝記錄頁面) ,另外“上一步”、“下一步”、“取消”等按鈕需要額外的語言包文件來載入,不如“現代用戶界面”只需要一個指令(!insertmacro MUI_LANGUAGE "SimpChinese")來指定采用的語言,所以接下來我們還是采用“現代用戶界面”來制作安裝包,當然這些界面上的圖標,任何地方的文字都是可以定制的。

下面章節就以實際中的應用作為例子,然后由該例子展開來說明頁面的定制、PowerShell命令的調用、SQL Server數據庫的訪問、Web應用程序的部署、失敗的回滾和卸載程序的執行等等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM