NSIS是一個開源的Windows平台下的安裝程序制作程序,由C/C++語言編寫。想了解更多內容請訪問百度百科。
怎么獲得NSIS呢?這里有NSIS ANSI版本和NSIS Unicode版本下載地址。
安裝完成后就可以編輯我們的腳本了。
我使用的是Notepad++這款文本編輯器,新建一個文件,[Ctrl]+[Alt]+S
將文件另存為擴展名為.nsi
的文件,這樣在我們編輯時就可以享受Notepad++提供的代碼高亮和自動完成功能了。
1. 編碼格式(亂碼)問題
根據NSIS是ANSI版本還是Unicode版本來確定腳本的編碼格式:
- ANSI版本: 在Notepad++的菜單欄選擇
[格式]->[以ANSI格式編碼]
- Unicode版本:
[格式]->[以UCS-2 Little Endian格式編碼]
如果文件中已有文本,請選擇[轉為...編碼格式]
,否則可能會導致編譯出的安裝程序顯示亂碼。
2. 多語言安裝界面
引用NSIS安裝目錄下Contrib\Language files\
的.nlf
類型語言文件,並在初始化時添加語言選項,具體實現請看代碼:
; 引用語言資源文件(注意文件路徑)
LoadLanguageFile "SimpChinese.nlf"
LoadLanguageFile "English.nlf"
; 添加語言選項
Function .onInit
Push ""
Push ${LANG_ENGLISH}
Push English
Push ${LANG_SIMPCHINESE}
Push "簡體中文"
Push A ; A means auto count languages
; for the auto count to work the first empty push (Push "") must remain
LangDLL::LangDialog "Installer Language" "Please select the language of the installer"
Pop $LANGUAGE
StrCmp $LANGUAGE "cancel" 0 +2
Abort
FunctionEnd
如果腳本中引用了MUI2.nsh
頭文件,則腳本代碼如下:
; 引用"MUI2.nsh"頭文件的腳本
!include "MUI2.nsh"
; 語言設置
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "SimpChinese"
; 顯示語言選項
Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd
3. 自定義變量的使用
假如我們的腳本中有多處使用軟件名稱,並且以后可能會更改軟件名稱,有什么簡便的方法來避免復制、粘貼、替換嗎?
當然有。對於這種情況,我們可以定義一個變量,並在初始化時給變量賦值,具體實現請看代碼:
; 軟件名稱
Var SoftName
Function .onInit
StrCpy $SoftName "XXX"
FunctionEnd
Function un.onInit
StrCpy $SoftName "XXX"
FunctionEnd
4. 安裝完成頁面定制
在安裝完成后,我們可能需要為用戶提供可選的運行選項,如:運行XXX程序、打開Readme文件、訪問XXX網站等。下面是MUI_FINISHPAGE
支持的屬性:
# 運行XXX程序
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_TEXT
!define MUI_FINISHPAGE_RUN_PARAMETERS
!define MUI_FINISHPAGE_RUN_NOTCHECKED ;默認不選中
!define MUI_FINISHPAGE_RUN_FUNCTION
; 自述文件
!define MUI_FINISHPAGE_SHOWREADME
!define MUI_FINISHPAGE_SHOWREADME_TEXT
!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
!define MUI_FINISHPAGE_SHOWREADME_FUNCTION
# 訪問XXX網站
!define MUI_FINISHPAGE_LINK
!define MUI_FINISHPAGE_LINK_LOCATION
!define MUI_FINISHPAGE_LINK_COLOR
引用MUI2.nsh
頭文件的例子:
; 引用MUI2.nsh頭文件
!include "MUI2.nsh"
; 定義完成后要運行的程序
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION "runSoft"
!define MUI_FINISHPAGE_RUN_TEXT "運行 $SoftName"
Function "runSoft"
/*
運行的程序,可以多個
如果只運行一個程序,可以這么寫:
!define MUI_FINISHPAGE_RUN "$INSTDIR\XXX.exe"
*/
FunctionEnd
; 自述文件
!define MUI_FINISHPAGE_SHOWREADME "readme.txt"
; 默認不選中自述文件復選框
!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
; 訪問XXX網站
!define MUI_FINISHPAGE_LINK "XXX"
!define MUI_FINISHPAGE_LINK_LOCATION "http://www.XXX.com"
; 文字顏色為紅
!define MUI_FINISHPAGE_LINK_COLOR "FF0000"
5. 執行外部命令
- Exec '"命令" [可選參數]'
- ExecShell "動作" "命令" [參數] [SW_SHOWNORMAL | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED | SW_HIDE]
- ExecWait '"命令"' [用戶變量(返回代碼)]
- nsExec::Exec [參數]
6. 注冊DLL組件
如果我們發布的程序中有動態鏈接庫需要注冊到系統中,下面代碼是一個比較通用的例子,將安裝目錄下的所有.dll
類型文件注冊到系統:
; 注冊安裝目錄下的所有DLL到系統中
FindFirst $0 $1 $INSTDIR\*.dll
loop:
StrCmp $1 "" done
DetailPrint $1
RegDLL $INSTDIR\$1
FindNext $0 $1
Goto loop
done:
FindClose $0
7. 快捷方式
生成快捷方式
# 在桌面生成快捷方式
CreateShortCut "$DESKTOP\XXX.lnk" "$INSTDIR\XXX.exe"
# 在開始菜單生成快捷方式
CreateDirectory "$SMPROGRAMS\XXX" ; 在開始菜單創建程序文件夾
CreateShortCut "$SMPROGRAMS\XXX\XXX.lnk" "$INSTDIR\XXX.exe"
CreateShortCut "$SMPROGRAMS\XXX\卸載XXX.lnk" "$INSTDIR\XXX.exe"
# 在快速啟動欄生成快捷方式
CreateShortCut "$QUICKLAUNCH\XXX.lnk" "$INSTDIR\XXX.exe"
刪除快捷方式
在Win7下創建快捷方式時,可能由於權限問題,快捷方式被創建到所有用戶的路徑,而不是當前用戶的路徑。XP不存在此問題。解決方法是:同時刪除當前用戶和所有用戶路徑下的快捷方式,示例代碼如下:
# 設置為當前用戶
SetShellVarContext current
Call un.DeleteShortCut ; 刪除快捷方式函數
; 注意:如果此段代碼在'Section "Uninstall"'里,函數名前必須加un.
# 設置為所有用戶
SetShellVarContext all
Call un.DeleteShortCut
刪除快捷方式函數可以這樣寫:
# 刪除桌面快捷方式
Delete "$DESKTOP\XXX.lnk"
# 刪除快捷啟動欄快捷方式
Delete "$QUICKLAUNCH\XXX.lnk"
# 刪除開始菜單快捷方式文件夾
RMDir /r "$SMPROGRAMS\XXX" /* /r遞歸刪除目錄 */
以上是我在使用NSIS過程遇到的一些問題,利用一些閑暇時間總結整理寫出的這篇心得,以備不時之需。
3gbywork
2015/12/28