NSIS 確實是一個不錯的安裝程序製做軟件。新版本2.0a7真正實現了中文支持和支持 WinXP 的安裝對話框。不過要用它實現漂亮的安裝界面和完美的安裝功能就必須好好的寫腳本。而 NSIS 的腳本指令是在是太多了,有時候以爲好像又回到了學習 C 語言的年代。他豐富而起強大的功能甚至能夠編譯出一些小而使用的軟件(例如查找窗口句柄,而後...)好了,很少說。我在這裏着重介紹關於 NSIS 的一些使用問題以及新界面安裝程序的製做過程,中間會附上一個示例腳本。
這裏只說單語言的簡體中文
1. NSIS的運行問題
2.0a7 的 NSIS 安裝在長文件名的目錄中好像會有問題(Win2k 和 WinXP 下,Win98 下好像沒問題)。你如果將NSIS 安裝在相似於「E:\System\Installer\NSIS 的目錄中」(其中的「Installer」是超過了 8 個字符的長文件名),運行 makensisw 或是直接在命令提示符中使用 makensis 可能會非法操做。
解決的辦法是:在命令提示符下使用以下指令:
cd E:\System\Instal~1\NSIS
進入 NSIS 安裝目錄後使用命令行:
makensis /CD /X"Compressor bzip2" "f:\1.nsi"
你能夠在腳本文件中使用了「SetCompressor bzip2」指令,這樣就能夠去掉「/X"Compressor bzip2"」參數。使用 makensisw 的朋友我就很少說了,你能夠從我上面的分析中獲得點啓發。本身設置一下它的運行參數吧!不過 makensisw 也有 Bug,若用 makensisw 編譯時發現腳本錯誤,程序就立馬非法操做。
2. 關於腳本的總體佈局
說 NSIS 有些象高級語言的語法一點沒錯。NSIS 的語法很是注重前後順序(我曾經爲了一個指令的前後順序來回 Ctrl+C & Ctrl+V 了 N 次)。例如象它的幫助文件中提到的「SetFont」指令必須在「AddBrandingImage」指令以前等。我在這裏要說的而是關於如何正確的對腳本進行總體佈局,使其能更加合理、高效的被使用,這樣纔有利於往後的安裝程序更新
你能夠用我後面的示例腳本爲模板製做本身的 NSIS 腳本。
大致佈局以下:
//////////////////////////////////////////////////////////////
預設參數(包括外部壓縮器選擇、編譯選項、宏定義以及文件包含等)
普通安裝設置
自定義函數
安裝程序區域內容
安裝程序回調函數及其相關函數定義
卸載程序區域內容
卸載程序回調函數及其相關函數定義
//////////////////////////////////////////////////////////////
3. 關於安裝程序 Logo 畫面的說明:
先前版本的 NSIS 使用 splash.exe 製做 logo畫面,但若您使用 2.0a7,
我建議您使用(好像也只能使用)magiclime.exe,它在 Win2k 和 WinXP
下顯示 logo畫面時會有淡入淡出的效果。超 Cool....
4. 關於標牌位圖(即顯示在安裝程序對話框中的自定義位圖)的說明:
2.0a7 提供了宏指令用於在安裝程序的對話框中顯示標牌位圖。固然你也能夠用標準的 NSIS 指令。
5. 關於使用新的 Modern UI 界面的說明:
2.0a7 一樣提供了宏指令使你可使用全新的安裝界面:
首先你須要安裝 NSIS v2.0a7 簡體中文補丁(漢化新世紀有下載):
而後打開安裝目錄下的 Examples\Modern UI\ModernUI.nsh 文件,將從
!macro MUI_INTERFACE UI ICON UNICON CHECKS PROGRESSBAR
到第一個
!macroend
之間的註釋符(即分號)刪除(若沒有這步究省了)。保存。
接下來就能夠在你本身的腳本中使用形式對話框了,而且支持 WinXP 的新的視覺效果樣式。
6. 如下是個人示例腳本:
html
////////////////////////////////////////////////////////////////////////////
[color=#008000]; study.nsi
;
; 如下腳本用以生成 study.exe 文件
; 它包含有受權協議
;
; 安裝時若發現應用程序正在運行,安裝程序會提示並替用戶關閉應用程序
; 安裝成功後會自動運行應用程序
;
; 啓用新的 Modern UI 的宏指令語法,原先的部分指令將被禁止以防止重複
; 我會盡可能展現如何基本指令的用法。固然宏指令也會與一些基本指令發生重
; 復定義的狀況,不過 NSIS 照樣能編譯成功.
; 其中的一些路徑、文件你能夠根據須要更改
; 啓用外部壓縮工具(這裏咱們不用,緣由看第 10 步)
;!define HAVE_UPX
; 若啓用了外部壓縮工具,這進行可執行文件頭的壓縮
!ifdef HAVE_UPX
; 用 UPX 壓縮可執行文件頭(用其餘的相關工具也行)
!packhdr tmp.dat "E:UPX\upx --best tmp.dat"
!endif
; 編譯選項
; 設置覆蓋標記
SetOverwrite on
; 設置壓縮選項
SetCompress auto
; 選擇壓縮方式
SetCompressor bzip2
; 設置數據塊優化
SetDatablockOptimize on
; 設置數據寫入時間
SetDateSave on
; 相關數據預設
; 軟件的名字,後面的${NAME}調用這個名字
!define NAME "NSIS"
!define NAME_FULL "全方位掌握 NSIS 的使用"
!verbose 3
; 包含窗口消息定義文件
!include "${NSISDIR}\Examples\WinMessages.nsh"
; 包含新界面的宏指令文件
!include "${NSISDIR}\Examples\Modern UI\ModernUI.nsh"
; 包含標牌位圖宏指令文件
!include "${NSISDIR}\Examples\branding.nsh"
!verbose 4
!define CURRENTPAGE $9
!define TEMP1 $R0
!define TEMP2 $R1
; 插入安裝界面宏定義(這裏我禁用了,啓用也沒問題。編譯照樣經過。後面我都定義過了)
;!insertmacro MUI_INTERFACE "modern2.exe" "adni18-installer-C-no48xp.ico" "adni18-uninstall-C-no48xp.ico" "modern.bmp" "smooth"
; 安裝程序設置
; 輸出文件
OutFile "F:\study.exe"
; 安裝程序名稱
Name /LANG=2052 "NSIS"
; 替換對話框樣式
ChangeUI all "${NSISDIR}\Contrib\UIs\modern2.exe"
; 啓用 WindowsXP 的視覺樣式
XPstyle on
;設置字體
SetFont 宋體 9
; 標題名稱
Caption /LANG=2052 "全方位掌握 NSIS 的使用"
; 標牌的內容
BrandingText /LANG=2052 /TRIMCENTER "Shao Hao"
; 安裝程序圖標
Icon "F:\12\QCDIcon.ico"
; 安裝程序顯示標題
WindowIcon on
; 添加標牌位圖(放在頂部用 TOP 參數。後面接高度)
AddBrandingImage LEFT 105
; 設定漸變背景
BGGradient off
; 設置安靜安裝模式
;SilentInstall normal
; 設置安靜卸載模式
;SilentUnInstall normal
; 執行 CRC 檢查(最好用 on 打開。關閉是由於還要修改安裝程序,看第 10 步)
CRCCheck off
; 加載相應的語言文件
LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf"
; 替換各個對話框標題的文字
SubCaption /LANG=2052 0 "受權協議"
SubCaption /LANG=2052 1 "安裝選項"
SubCaption /LANG=2052 2 "安裝目錄"
SubCaption /LANG=2052 3 "正在安裝"
SubCaption /LANG=2052 4 "完成安裝"
; 替換默認按鈕的文字
MiscButtonText /LANG=2052 "< 上一步" "下一步 >" "取消" "關閉"
; 替換「安裝」按鈕的文字
;InstallButtonText /LANG=2052 "安裝"
; 替換當文件沒法被寫入時的警告窗的文字
FileErrorText /LANG=2052 "沒法寫入文件$\r$\n$0$\r$\n請確認文件屬性不是隻讀且未被使用中!"
; 默認的安裝目錄
InstallDir "$PROGRAMFILES\QCD 3"
; 若是可能的化從註冊表中監測安裝路徑
InstallDirRegKey HKLM \
"Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" \
"UninstallString"
; 受權協議頁面
LicenseText /LANG=2052 "NSIS 是免費軟件。安裝前請先閱讀如下協議條款" "我贊成"
; 使用受權協議文本
LicenseData /LANG=2052 "F:\12\License.txt"
; 設置受權協議頁面的背景色
;LicenseBkColor 000000
; 選擇要按安裝的組件
ComponentText /LANG=2052 "如今將安裝 ${NAME_FULL}到您的計算機:" "請選擇安裝類型" "或選擇您但願安裝的組件"
InstType "徹底安裝(都在了)"
InstType "典型安裝"
InstType /LANG=2052 /CUSTOMSTRING=自定義?
;InstType /LANG=2052 /NOCUSTOM
;InstType /COMPONENTSONLYONCUSTOM
CheckBitmap "${NSISDIR}\Contrib\Icons\modern.bmp"
; 替換顯示磁盤空間信息的文字
SpaceTexts /LANG=2052 "所需空間:" "可用空間:"
; 提示用戶輸入目錄的文本
; DirShow hide
; 替換顯示選擇安裝目錄的文字
DirText /LANG=2052 "請選擇 ${NAME} 的安裝路徑:" "選擇目錄用以安裝 ${NAME}:" "瀏覽..."
; 是否容許安裝在根目錄下
AllowRootDirInstall false
; 安裝信息的顏色
;InstallColors 000000 FFFFFF
; 安裝進度條顯示方式
InstProgressFlags smooth colored
; 完成後自動關閉安裝程序
AutoCloseWindow true
; 顯示「顯示詳細細節」對話框
ShowInstDetails hide
; 替換「顯示細節」按鈕的文字
DetailsButtonText /LANG=2052 "顯示細節"
; 替換「完成」按鈕的文字
CompletedText /LANG=2052 "已完成"
; 卸載程序設置
; 替換卸載程序的文字
UninstallText /LANG=2052 "如今將從你的系統中卸載 ${NAME}:" "卸載目錄:"
; 卸載程序圖標
UninstallIcon "F:\12\UnQCDIcon.ico"
; 替換卸載程序標題的文字
UninstallCaption /LANG=2052 "卸載 ${NAME}"
; 替換卸載程序每頁按鈕的文字
UninstallSubCaption /LANG=2052 0 ":確認"
UninstallSubCaption /LANG=2052 1 ":正在刪除文件"
UninstallSubCaption /LANG=2052 2 ":完成"
; 卸載程序顯示方式
ShowUninstDetails hide
; 替換「卸載」按鈕的文字
UninstallButtonText /LANG=2052 "卸載"
; 安裝程序內容及其相關的回調函數
; 安裝程序內容
Section /e "!主要程序(必須安裝)" SecCore
SectionIn 1 2 RO
; 設置輸出路徑,每次使用都會改變
SetOutPath $INSTDIR
; 循環包含目錄下所有內容
File /r "F:\12\1\*.*"
; 只包含一個文件
File "F:\12\gf.gif"
; 處理動態鏈接庫文件
IfFileExists "$INSTDIR\1.dll" 0 NoFile1
; 取消組件註冊
UnRegDll "$INSTDIR\1.dll"
Delete "$INSTDIR\1.dll"
NoFile1:
File "F:\12\1.dll"
; 註冊組件
RegDLL "$INSTDIR\QCDIconMgr.dll"
; 寫入軟件註冊鍵值
WriteRegStr HKLM "Software\NSIS\NSIS" "" "$INSTDIR"
; 爲 Windows 卸載程序寫入鍵值
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "DisplayName" "NSIS(只用於移除)"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "UninstallString" '"$INSTDIR\uninst.exe"'
; 寫入生成卸載程序(可屢次使用)
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
Section /e "擴展(可選)" SecUpdate
SectionIn 1
SetOutPath "$INSTDIR\Plugins"
File "F:\12\qcdplus\Plugins\2.dll"
File /r "F:\12\qcdplus\Plugins\3"
SectionEnd
SubSection /e "選項" SecOptions
Section /e "建立桌面圖標" SecDesktopShortCut
SectionIn 1 2
SetOutPath "$INSTDIR\Plugins"
CreateShortCut "$DESKTOP\NSIS.lnk" "$INSTDIR\gf.gif"
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
Section /e "建立快速啓動欄圖標" SecQuickbarShortCut
SectionIn 1 2
SetOutPath "$INSTDIR\Plugins"
CreateShortCut "$QUICKLAUNCH\NSIS.lnk" "$INSTDIR\gf.gif"
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
Section /e "建立 NSIS 程序組" SecShortCutGroup
SectionIn 1 2
SetOutPath "$INSTDIR\Plugins"
CreateDirectory "$SMPROGRAMS\NSIS"
CreateShortCut "$SMPROGRAMS\QCD Player\gf.lnk" "$INSTDIR\gf.gif"
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
SubSectionEnd
Section "-Run"; 運行?
ExecWait '"$INSTDIR\2.exe" -p'
WriteINIStr "$INSTDIR\NSIS.ini" "2" "Language" "Chinese"
Exec "$INSTDIR\2.exe"
ExecShell open "$INSTDIR\漢化說明.htm"
SectionEnd
Section ""
;Invisible section to display the Finish header
!insertmacro MUI_FINISHHEADER SetHeader
SectionEnd
; 安裝程序初始化設置
Function .onInit
; 發現有程序正在運行時提示退出後繼續運行
loop:
FindWindow $R0 "NSIS"
IntCmp $R0 0 done
MessageBox MB_OKCANCEL \
"NSIS 正在運行。$\n點擊「肯定」按鈕會關閉 NSIS 而後繼續安裝,點擊「取消」按鈕將退出安裝程序" \
IDOK NoAbort
Abort
NoAbort:
SendMessage $R0 1029 0 0
; 稍等後繼續檢測直至檢測不到或用戶選擇取消
Sleep 444
Goto loop
done:
; 顯示 Logo 畫面
SetOutPath $TEMP
File /oname=qcd_logo.bmp "F:\12\logo.bmp"
File /oname=magiclime.exe "${NSISDIR}\Bin\magiclime.exe"
ExecWait '"$TEMP\magiclime.exe" qcd_logo.bmp'
Delete "$TEMP\magiclime.exe"
Delete "$TEMP\qcd_logo.bmp"
; 初始化標牌位圖
!insertmacro BI_INIT $R0
FunctionEnd
; 安裝程序主界面的相關文本
Function SetHeader
!insertmacro MUI_HEADER_INIT
!insertmacro MUI_HEADER_START 1
!insertmacro MUI_HEADER_TEXT 2052 "受權協議" "安裝 ${NAME} 以前,請認真閱讀一下受權條款."
!insertmacro MUI_HEADER_STOP 1
!insertmacro MUI_HEADER_START 2
!insertmacro MUI_HEADER_TEXT 2052 "選擇組件" "請選擇你要安裝的組件."
!insertmacro MUI_HEADER_STOP 2
!insertmacro MUI_HEADER_START 3
!insertmacro MUI_HEADER_TEXT 2052 "選擇安裝位置" "爲 ${NAME} 選擇一個安裝目錄."
!insertmacro MUI_HEADER_STOP 3
!insertmacro MUI_HEADER_START 4
!insertmacro MUI_HEADER_TEXT 2052 "安裝" "${NAME} 已經安裝,請等待."
!insertmacro MUI_HEADER_STOP 4
!insertmacro MUI_HEADER_START 5
!insertmacro MUI_HEADER_TEXT 2052 "完成" "安裝順利完成."
!insertmacro MUI_HEADER_STOP 5
!insertmacro MUI_HEADER_END
FunctionEnd
; 初始化安裝程序對話框的顯示文本
Function .onInitDialog
!insertmacro MUI_INNERDIALOG_INIT
!insertmacro MUI_INNERDIALOG_START 1
!insertmacro MUI_INNERDIALOG_TEXT 2052 1040 "若是你贊成協議中的全部條款,選擇「我一樣」繼續安裝,若是你選擇了「取消」,安裝程序將終止,只有接受條款才能安裝 ${NAME}."
!insertmacro MUI_INNERDIALOG_STOP 1
!insertmacro MUI_INNERDIALOG_START 2
!insertmacro MUI_INNERDIALOG_TEXT 2052 1042 "描述"
!insertmacro MUI_INNERDIALOG_TEXT 2052 1043 "移動你的鼠標到組件上,即可以見到相關的描述."
!insertmacro MUI_INNERDIALOG_STOP 2
!insertmacro MUI_INNERDIALOG_START 3
!insertmacro MUI_INNERDIALOG_TEXT 2052 1041 "目標文件夾"
!insertmacro MUI_INNERDIALOG_STOP 3
!insertmacro MUI_INNERDIALOG_END
FunctionEnd
; 轉到下頁面時的處理
Function .onNextPage
!insertmacro MUI_NEXTPAGE_OUTER
!insertmacro MUI_NEXTPAGE SetHeader
; 標牌位圖設置
!insertmacro BI_NEXT
FunctionEnd
; 轉到上一頁面時的處理
Function .onPrevPage
!insertmacro MUI_PREVPAGE
; 標牌位圖設置
!insertmacro BI_PREV
FunctionEnd
; 鼠標移到指定組件時的顯示處理
Function .onMouseOverSection
; 用宏指令設置安裝本身的註釋文本
!insertmacro MUI_DESCRIPTION_INIT
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecCore} "安裝主應用程序"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecUpdate} "安裝 NSIS 的更新或新增插件"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecOptions} "選擇 NSIS 的其餘安裝選項,例如:建立快捷方式和應用程序組的"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecDesktopShortCut} "在用戶的桌面上建立 NSIS 的快捷方式"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecQuickbarShortCut} "在用戶的快速欄裏建立 NSIS 快捷方式"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecShortCutGroup} "在用戶的開始菜單的程序中建立 NSIS 的快捷方式組"
!insertmacro MUI_DESCRIPTION_END
FunctionEnd
; 安裝成功完成後的設置
Function .onInstSuccess
; 本身加吧:)
FunctionEnd
; 放棄安裝時警告窗口的顯示信息
Function .onUserAbort
!insertmacro MUI_ABORTWARNING 2052 "你肯定要推出 ${NAME} 的安裝嗎?"
!insertmacro MUI_ABORTWARNING_END
FunctionEnd
; 安裝程序標牌位圖列表
!insertmacro BI_LIST
!insertmacro BI_LIST_ADD "F:\12\Brand1.bmp" /RESIZETOFIT
!insertmacro BI_LIST_ADD "F:\12\Brand2.bmp" /RESIZETOFIT
!insertmacro BI_LIST_ADD "F:\12\Brand3.bmp" /RESIZETOFIT
!insertmacro BI_LIST_END
; 卸載程序及其相關回調函數
; 卸載程序內容
Section "Uninstall"
ExecWait '"$INSTDIR\12.exe" /un'
; 循環刪除文件直至刪除文件夾
RMDir /r "$SMPROGRAMS\NSIS"
UnRegDLL "$INSTDIR\2.dll"
Delete "$INSTDIR\QCDIconMgr.dll"
Delete "$INSTDIR\*.*"
DeleteRegKey HKLM "Software\NSIS"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS"
MessageBox MB_YESNO|MB_ICONQUESTION \
"是否連插件目錄也要刪除?$\n(若您要保留這些文件,請點擊下面的「否」按鈕)" \
IDNO NoDelete
; 全刪光!!!
RMDir /r "$INSTDIR"
NoDelete:
SectionEnd
; 定義卸載程序標牌位圖
!define BI_UNINSTALL
!include "${NSISDIR}\Examples\branding.nsh"
; 初始化卸載程序對話框的設置
Function un.onInit
; 初始化標牌位圖
!insertmacro BI_INIT $R0
FunctionEnd
; 卸載程序主界面的相關文本
Function un.SetHeader
!insertmacro MUI_HEADER_INIT
!insertmacro MUI_HEADER_START 1
!insertmacro MUI_HEADER_TEXT 2052 "卸載 ${NAME}" "${NAME_FULL} 將從你的系統裏移除."
!insertmacro MUI_HEADER_STOP 1
!insertmacro MUI_HEADER_START 2
!insertmacro MUI_HEADER_TEXT 2052 "卸載" "${NAME} 正在被卸載,請等待."
!insertmacro MUI_HEADER_STOP 2
!insertmacro MUI_HEADER_START 3
!insertmacro MUI_HEADER_TEXT 2052 "完成" "${NAME_FULL} 已從你的系統中移除."
!insertmacro MUI_HEADER_STOP 3
!insertmacro MUI_HEADER_END
FunctionEnd
; 初始化卸載程序對話框時的處理
Function un.onInitDialog
; 本身加:)
FunctionEnd
; 卸載程序轉到下一頁時的處理
Function un.onNextPage
!insertmacro MUI_NEXTPAGE_OUTER
!insertmacro MUI_NEXTPAGE un.SetHeader
; 標牌位圖設置
!insertmacro BI_NEXT
FunctionEnd
; 卸載程序完成時的處理
Function un.onUninstSuccess
; 再加^_^
FunctionEnd
; 放棄卸載程序時的處理
Function un.onUserAbort
FunctionEnd
; 卸載程序標牌位圖列表
!insertmacro BI_LIST
!insertmacro BI_LIST_ADD "F:\12\UnBrand1.bmp" /RESIZETOFIT
!insertmacro BI_LIST_ADD "F:\12\UnBrand2.bmp" /RESIZETOFIT
!insertmacro BI_LIST_END
; 結束
/////////////////////////////////////////////////////////////////////////////
[/color]
NSIS 確實是一個不錯的安裝程序製做軟件。新版本 2.0a7 真正實現了中文支持和支持 WinXP 的安裝對話框。不過要用它實現漂亮的安裝界面和完美的安裝功能就必須好好的寫腳本。而 NSIS 的腳本指令是在是太多了,有時候以爲好像又回到了學習 C 語言的年代。他豐富而起強大的功能甚至能夠編譯出一些小而使用的軟件(例如查找窗口句柄,而後...)好了,很少說。我在這裏着重介紹關於 NSIS 的一些使用問題以及新界面安裝程序的製做過程,中間會附上一個示例腳本。
這裏只說單語言的簡體中文
1. NSIS的運行問題
2.0a7 的 NSIS 安裝在長文件名的目錄中好像會有問題(Win2k 和 WinXP 下,Win98 下好像沒問題)。你如果將NSIS 安裝在相似於「E:\System\Installer\NSIS 的目錄中」(其中的「Installer」是超過了 8 個字符的長文件名),運行 makensisw 或是直接在命令提示符中使用 makensis 可能會非法操做。
解決的辦法是:在命令提示符下使用以下指令:
cd E:\System\Instal~1\NSIS
進入 NSIS 安裝目錄後使用命令行:
makensis /CD /X"Compressor bzip2" "f:\1.nsi"
你能夠在腳本文件中使用了「SetCompressor bzip2」指令,這樣就能夠去掉「/X"Compressor bzip2"」參數。使用 makensisw 的朋友我就很少說了,你能夠從我上面的分析中獲得點啓發。本身設置一下它的運行參數吧!不過 makensisw 也有 Bug,若用 makensisw 編譯時發現腳本錯誤,程序就立馬非法操做。
2. 關於腳本的總體佈局
說 NSIS 有些象高級語言的語法一點沒錯。NSIS 的語法很是注重前後順序(我曾經爲了一個指令的前後順序來回 Ctrl+C & Ctrl+V 了 N 次)。例如象它的幫助文件中提到的「SetFont」指令必須在「AddBrandingImage」指令以前等。我在這裏要說的而是關於如何正確的對腳本進行總體佈局,使其能更加合理、高效的被使用,這樣纔有利於往後的安裝程序更新
你能夠用我後面的示例腳本爲模板製做本身的 NSIS 腳本。
大致佈局以下:
//////////////////////////////////////////////////////////////
預設參數(包括外部壓縮器選擇、編譯選項、宏定義以及文件包含等)
普通安裝設置
自定義函數
安裝程序區域內容
安裝程序回調函數及其相關函數定義
卸載程序區域內容
卸載程序回調函數及其相關函數定義
//////////////////////////////////////////////////////////////
3. 關於安裝程序 Logo 畫面的說明:
先前版本的 NSIS 使用 splash.exe 製做 logo畫面,但若您使用 2.0a7,
我建議您使用(好像也只能使用)magiclime.exe,它在 Win2k 和 WinXP
下顯示 logo畫面時會有淡入淡出的效果。超 Cool....
4. 關於標牌位圖(即顯示在安裝程序對話框中的自定義位圖)的說明:
2.0a7 提供了宏指令用於在安裝程序的對話框中顯示標牌位圖。固然你也能夠用標準的 NSIS 指令。
5. 關於使用新的 Modern UI 界面的說明:
2.0a7 一樣提供了宏指令使你可使用全新的安裝界面:
首先你須要安裝 NSIS v2.0a7 簡體中文補丁(漢化新世紀有下載):
而後打開安裝目錄下的 Examples\Modern UI\ModernUI.nsh 文件,將從
!macro MUI_INTERFACE UI ICON UNICON CHECKS PROGRESSBAR
到第一個
!macroend
之間的註釋符(即分號)刪除(若沒有這步究省了)。保存。
接下來就能夠在你本身的腳本中使用形式對話框了,而且支持 WinXP 的新的視覺效果樣式。
6. 如下是個人示例腳本:

引用來自 2005-12-7 上午 10:15:26
//////////////////////////////////////////////////////////////////////////// [color=#008000]; study.nsi ; ; 如下腳本用以生成 study.exe 文件 ; 它包含有受權協議 ; ; 安裝時若發現應用程序正在運行,安裝程序會提示並替用戶關閉應用程序 ; 安裝成功後會自動運行應用程序 ; ; 啓用新的 Modern UI 的宏指令語法,原先的部分指令將被禁止以防止重複 ; 我會盡可能展現如何基本指令的用法。固然宏指令也會與一些基本指令發生重 ; 復定義的狀況,不過 NSIS 照樣能編譯成功. ; 其中的一些路徑、文件你能夠根據須要更改 ; 啓用外部壓縮工具(這裏咱們不用,緣由看第 10 步) ;!define HAVE_UPX ; 若啓用了外部壓縮工具,這進行可執行文件頭的壓縮 !ifdef HAVE_UPX ; 用 UPX 壓縮可執行文件頭(用其餘的相關工具也行) !packhdr tmp.dat "E:UPX\upx --best tmp.dat" !endif ; 編譯選項 ; 設置覆蓋標記 SetOverwrite on ; 設置壓縮選項 SetCompress auto ; 選擇壓縮方式 SetCompressor bzip2 ; 設置數據塊優化 SetDatablockOptimize on ; 設置數據寫入時間 SetDateSave on ; 相關數據預設 ; 軟件的名字,後面的${NAME}調用這個名字 !define NAME "NSIS" !define NAME_FULL "全方位掌握 NSIS 的使用" !verbose 3 ; 包含窗口消息定義文件 !include "${NSISDIR}\Examples\WinMessages.nsh" ; 包含新界面的宏指令文件 !include "${NSISDIR}\Examples\Modern UI\ModernUI.nsh" ; 包含標牌位圖宏指令文件 !include "${NSISDIR}\Examples\branding.nsh" !verbose 4 !define CURRENTPAGE $9 !define TEMP1 $R0 !define TEMP2 $R1 ; 插入安裝界面宏定義(這裏我禁用了,啓用也沒問題。編譯照樣經過。後面我都定義過了) ;!insertmacro MUI_INTERFACE "modern2.exe" "adni18-installer-C-no48xp.ico" "adni18-uninstall-C-no48xp.ico" "modern.bmp" "smooth" ; 安裝程序設置 ; 輸出文件 OutFile "F:\study.exe" ; 安裝程序名稱 Name /LANG=2052 "NSIS" ; 替換對話框樣式 ChangeUI all "${NSISDIR}\Contrib\UIs\modern2.exe" ; 啓用 WindowsXP 的視覺樣式 XPstyle on ;設置字體 SetFont 宋體 9 ; 標題名稱 Caption /LANG=2052 "全方位掌握 NSIS 的使用" ; 標牌的內容 BrandingText /LANG=2052 /TRIMCENTER "Shao Hao" ; 安裝程序圖標 Icon "F:\12\QCDIcon.ico" ; 安裝程序顯示標題 WindowIcon on ; 添加標牌位圖(放在頂部用 TOP 參數。後面接高度) AddBrandingImage LEFT 105 ; 設定漸變背景 BGGradient off ; 設置安靜安裝模式 ;SilentInstall normal ; 設置安靜卸載模式 ;SilentUnInstall normal ; 執行 CRC 檢查(最好用 on 打開。關閉是由於還要修改安裝程序,看第 10 步) CRCCheck off ; 加載相應的語言文件 LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf" ; 替換各個對話框標題的文字 SubCaption /LANG=2052 0 "受權協議" SubCaption /LANG=2052 1 "安裝選項" SubCaption /LANG=2052 2 "安裝目錄" SubCaption /LANG=2052 3 "正在安裝" SubCaption /LANG=2052 4 "完成安裝" ; 替換默認按鈕的文字 MiscButtonText /LANG=2052 "< 上一步" "下一步 >" "取消" "關閉" ; 替換「安裝」按鈕的文字 ;InstallButtonText /LANG=2052 "安裝" ; 替換當文件沒法被寫入時的警告窗的文字 FileErrorText /LANG=2052 "沒法寫入文件$\r$\n$0$\r$\n請確認文件屬性不是隻讀且未被使用中!" ; 默認的安裝目錄 InstallDir "$PROGRAMFILES\QCD 3" ; 若是可能的化從註冊表中監測安裝路徑 InstallDirRegKey HKLM \ "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" \ "UninstallString" ; 受權協議頁面 LicenseText /LANG=2052 "NSIS 是免費軟件。安裝前請先閱讀如下協議條款" "我贊成" ; 使用受權協議文本 LicenseData /LANG=2052 "F:\12\License.txt" ; 設置受權協議頁面的背景色 ;LicenseBkColor 000000 ; 選擇要按安裝的組件 ComponentText /LANG=2052 "如今將安裝 ${NAME_FULL}到您的計算機:" "請選擇安裝類型" "或選擇您但願安裝的組件" InstType "徹底安裝(都在了)" InstType "典型安裝" InstType /LANG=2052 /CUSTOMSTRING=自定義? ;InstType /LANG=2052 /NOCUSTOM ;InstType /COMPONENTSONLYONCUSTOM CheckBitmap "${NSISDIR}\Contrib\Icons\modern.bmp" ; 替換顯示磁盤空間信息的文字 SpaceTexts /LANG=2052 "所需空間:" "可用空間:" ; 提示用戶輸入目錄的文本 ; DirShow hide ; 替換顯示選擇安裝目錄的文字 DirText /LANG=2052 "請選擇 ${NAME} 的安裝路徑:" "選擇目錄用以安裝 ${NAME}:" "瀏覽..." ; 是否容許安裝在根目錄下 AllowRootDirInstall false ; 安裝信息的顏色 ;InstallColors 000000 FFFFFF ; 安裝進度條顯示方式 InstProgressFlags smooth colored ; 完成後自動關閉安裝程序 AutoCloseWindow true ; 顯示「顯示詳細細節」對話框 ShowInstDetails hide ; 替換「顯示細節」按鈕的文字 DetailsButtonText /LANG=2052 "顯示細節" ; 替換「完成」按鈕的文字 CompletedText /LANG=2052 "已完成" ; 卸載程序設置 ; 替換卸載程序的文字 UninstallText /LANG=2052 "如今將從你的系統中卸載 ${NAME}:" "卸載目錄:" ; 卸載程序圖標 UninstallIcon "F:\12\UnQCDIcon.ico" ; 替換卸載程序標題的文字 UninstallCaption /LANG=2052 "卸載 ${NAME}" ; 替換卸載程序每頁按鈕的文字 UninstallSubCaption /LANG=2052 0 ":確認" UninstallSubCaption /LANG=2052 1 ":正在刪除文件" UninstallSubCaption /LANG=2052 2 ":完成" ; 卸載程序顯示方式 ShowUninstDetails hide ; 替換「卸載」按鈕的文字 UninstallButtonText /LANG=2052 "卸載" ; 安裝程序內容及其相關的回調函數 ; 安裝程序內容 Section /e "!主要程序(必須安裝)" SecCore SectionIn 1 2 RO ; 設置輸出路徑,每次使用都會改變 SetOutPath $INSTDIR ; 循環包含目錄下所有內容 File /r "F:\12\1\*.*" ; 只包含一個文件 File "F:\12\gf.gif" ; 處理動態鏈接庫文件 IfFileExists "$INSTDIR\1.dll" 0 NoFile1 ; 取消組件註冊 UnRegDll "$INSTDIR\1.dll" Delete "$INSTDIR\1.dll" NoFile1: File "F:\12\1.dll" ; 註冊組件 RegDLL "$INSTDIR\QCDIconMgr.dll" ; 寫入軟件註冊鍵值 WriteRegStr HKLM "Software\NSIS\NSIS" "" "$INSTDIR" ; 爲 Windows 卸載程序寫入鍵值 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "DisplayName" "NSIS(只用於移除)" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "UninstallString" '"$INSTDIR\uninst.exe"' ; 寫入生成卸載程序(可屢次使用) WriteUninstaller "$INSTDIR\uninst.exe" SectionEnd Section /e "擴展(可選)" SecUpdate SectionIn 1 SetOutPath "$INSTDIR\Plugins" File "F:\12\qcdplus\Plugins\2.dll" File /r "F:\12\qcdplus\Plugins\3" SectionEnd SubSection /e "選項" SecOptions Section /e "建立桌面圖標" SecDesktopShortCut SectionIn 1 2 SetOutPath "$INSTDIR\Plugins" CreateShortCut "$DESKTOP\NSIS.lnk" "$INSTDIR\gf.gif" WriteUninstaller "$INSTDIR\uninst.exe" SectionEnd Section /e "建立快速啓動欄圖標" SecQuickbarShortCut SectionIn 1 2 SetOutPath "$INSTDIR\Plugins" CreateShortCut "$QUICKLAUNCH\NSIS.lnk" "$INSTDIR\gf.gif" WriteUninstaller "$INSTDIR\uninst.exe" SectionEnd Section /e "建立 NSIS 程序組" SecShortCutGroup SectionIn 1 2 SetOutPath "$INSTDIR\Plugins" CreateDirectory "$SMPROGRAMS\NSIS" CreateShortCut "$SMPROGRAMS\QCD Player\gf.lnk" "$INSTDIR\gf.gif" WriteUninstaller "$INSTDIR\uninst.exe" SectionEnd SubSectionEnd Section "-Run"; 運行? ExecWait '"$INSTDIR\2.exe" -p' WriteINIStr "$INSTDIR\NSIS.ini" "2" "Language" "Chinese" Exec "$INSTDIR\2.exe" ExecShell open "$INSTDIR\漢化說明.htm" SectionEnd Section "" ;Invisible section to display the Finish header !insertmacro MUI_FINISHHEADER SetHeader SectionEnd ; 安裝程序初始化設置 Function .onInit ; 發現有程序正在運行時提示退出後繼續運行 loop: FindWindow $R0 "NSIS" IntCmp $R0 0 done MessageBox MB_OKCANCEL \ "NSIS 正在運行。$\n點擊「肯定」按鈕會關閉 NSIS 而後繼續安裝,點擊「取消」按鈕將退出安裝程序" \ IDOK NoAbort Abort NoAbort: SendMessage $R0 1029 0 0 ; 稍等後繼續檢測直至檢測不到或用戶選擇取消 Sleep 444 Goto loop done: ; 顯示 Logo 畫面 SetOutPath $TEMP File /oname=qcd_logo.bmp "F:\12\logo.bmp" File /oname=magiclime.exe "${NSISDIR}\Bin\magiclime.exe" ExecWait '"$TEMP\magiclime.exe" qcd_logo.bmp' Delete "$TEMP\magiclime.exe" Delete "$TEMP\qcd_logo.bmp" ; 初始化標牌位圖 !insertmacro BI_INIT $R0 FunctionEnd ; 安裝程序主界面的相關文本 Function SetHeader !insertmacro MUI_HEADER_INIT !insertmacro MUI_HEADER_START 1 !insertmacro MUI_HEADER_TEXT 2052 "受權協議" "安裝 ${NAME} 以前,請認真閱讀一下受權條款." !insertmacro MUI_HEADER_STOP 1 !insertmacro MUI_HEADER_START 2 !insertmacro MUI_HEADER_TEXT 2052 "選擇組件" "請選擇你要安裝的組件." !insertmacro MUI_HEADER_STOP 2 !insertmacro MUI_HEADER_START 3 !insertmacro MUI_HEADER_TEXT 2052 "選擇安裝位置" "爲 ${NAME} 選擇一個安裝目錄." !insertmacro MUI_HEADER_STOP 3 !insertmacro MUI_HEADER_START 4 !insertmacro MUI_HEADER_TEXT 2052 "安裝" "${NAME} 已經安裝,請等待." !insertmacro MUI_HEADER_STOP 4 !insertmacro MUI_HEADER_START 5 !insertmacro MUI_HEADER_TEXT 2052 "完成" "安裝順利完成." !insertmacro MUI_HEADER_STOP 5 !insertmacro MUI_HEADER_END FunctionEnd ; 初始化安裝程序對話框的顯示文本 Function .onInitDialog !insertmacro MUI_INNERDIALOG_INIT !insertmacro MUI_INNERDIALOG_START 1 !insertmacro MUI_INNERDIALOG_TEXT 2052 1040 "若是你贊成協議中的全部條款,選擇「我一樣」繼續安裝,若是你選擇了「取消」,安裝程序將終止,只有接受條款才能安裝 ${NAME}." !insertmacro MUI_INNERDIALOG_STOP 1 !insertmacro MUI_INNERDIALOG_START 2 !insertmacro MUI_INNERDIALOG_TEXT 2052 1042 "描述" !insertmacro MUI_INNERDIALOG_TEXT 2052 1043 "移動你的鼠標到組件上,即可以見到相關的描述." !insertmacro MUI_INNERDIALOG_STOP 2 !insertmacro MUI_INNERDIALOG_START 3 !insertmacro MUI_INNERDIALOG_TEXT 2052 1041 "目標文件夾" !insertmacro MUI_INNERDIALOG_STOP 3 !insertmacro MUI_INNERDIALOG_END FunctionEnd ; 轉到下頁面時的處理 Function .onNextPage !insertmacro MUI_NEXTPAGE_OUTER !insertmacro MUI_NEXTPAGE SetHeader ; 標牌位圖設置 !insertmacro BI_NEXT FunctionEnd ; 轉到上一頁面時的處理 Function .onPrevPage !insertmacro MUI_PREVPAGE ; 標牌位圖設置 !insertmacro BI_PREV FunctionEnd ; 鼠標移到指定組件時的顯示處理 Function .onMouseOverSection ; 用宏指令設置安裝本身的註釋文本 !insertmacro MUI_DESCRIPTION_INIT !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecCore} "安裝主應用程序" !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecUpdate} "安裝 NSIS 的更新或新增插件" !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecOptions} "選擇 NSIS 的其餘安裝選項,例如:建立快捷方式和應用程序組的" !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecDesktopShortCut} "在用戶的桌面上建立 NSIS 的快捷方式" !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecQuickbarShortCut} "在用戶的快速欄裏建立 NSIS 快捷方式" !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecShortCutGroup} "在用戶的開始菜單的程序中建立 NSIS 的快捷方式組" !insertmacro MUI_DESCRIPTION_END FunctionEnd ; 安裝成功完成後的設置 Function .onInstSuccess ; 本身加吧:) FunctionEnd ; 放棄安裝時警告窗口的顯示信息 Function .onUserAbort !insertmacro MUI_ABORTWARNING 2052 "你肯定要推出 ${NAME} 的安裝嗎?" !insertmacro MUI_ABORTWARNING_END FunctionEnd ; 安裝程序標牌位圖列表 !insertmacro BI_LIST !insertmacro BI_LIST_ADD "F:\12\Brand1.bmp" /RESIZETOFIT !insertmacro BI_LIST_ADD "F:\12\Brand2.bmp" /RESIZETOFIT !insertmacro BI_LIST_ADD "F:\12\Brand3.bmp" /RESIZETOFIT !insertmacro BI_LIST_END ; 卸載程序及其相關回調函數 ; 卸載程序內容 Section "Uninstall" ExecWait '"$INSTDIR\12.exe" /un' ; 循環刪除文件直至刪除文件夾 RMDir /r "$SMPROGRAMS\NSIS" UnRegDLL "$INSTDIR\2.dll" Delete "$INSTDIR\QCDIconMgr.dll" Delete "$INSTDIR\*.*" DeleteRegKey HKLM "Software\NSIS" DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" MessageBox MB_YESNO|MB_ICONQUESTION \ "是否連插件目錄也要刪除?$\n(若您要保留這些文件,請點擊下面的「否」按鈕)" \ IDNO NoDelete ; 全刪光!!! RMDir /r "$INSTDIR" NoDelete: SectionEnd ; 定義卸載程序標牌位圖 !define BI_UNINSTALL !include "${NSISDIR}\Examples\branding.nsh" ; 初始化卸載程序對話框的設置 Function un.onInit ; 初始化標牌位圖 !insertmacro BI_INIT $R0 FunctionEnd ; 卸載程序主界面的相關文本 Function un.SetHeader !insertmacro MUI_HEADER_INIT !insertmacro MUI_HEADER_START 1 !insertmacro MUI_HEADER_TEXT 2052 "卸載 ${NAME}" "${NAME_FULL} 將從你的系統裏移除." !insertmacro MUI_HEADER_STOP 1 !insertmacro MUI_HEADER_START 2 !insertmacro MUI_HEADER_TEXT 2052 "卸載" "${NAME} 正在被卸載,請等待." !insertmacro MUI_HEADER_STOP 2 !insertmacro MUI_HEADER_START 3 !insertmacro MUI_HEADER_TEXT 2052 "完成" "${NAME_FULL} 已從你的系統中移除." !insertmacro MUI_HEADER_STOP 3 !insertmacro MUI_HEADER_END FunctionEnd ; 初始化卸載程序對話框時的處理 Function un.onInitDialog ; 本身加:) FunctionEnd ; 卸載程序轉到下一頁時的處理 Function un.onNextPage !insertmacro MUI_NEXTPAGE_OUTER !insertmacro MUI_NEXTPAGE un.SetHeader ; 標牌位圖設置 !insertmacro BI_NEXT FunctionEnd ; 卸載程序完成時的處理 Function un.onUninstSuccess ; 再加^_^ FunctionEnd ; 放棄卸載程序時的處理 Function un.onUserAbort FunctionEnd ; 卸載程序標牌位圖列表 !insertmacro BI_LIST !insertmacro BI_LIST_ADD "F:\12\UnBrand1.bmp" /RESIZETOFIT !insertmacro BI_LIST_ADD "F:\12\UnBrand2.bmp" /RESIZETOFIT !insertmacro BI_LIST_END ; 結束 ///////////////////////////////////////////////////////////////////////////// [/color]
7.注意兩個標牌位圖列表宏指令必須放置到函數的後面,就像我編寫的那樣,安裝程序的標牌位 圖列表放置到到全部安裝程序回調函數的後面;卸載程序的標牌位圖列表放置到全部卸載程序回 調函數的後面。 關鍵是要注意總體佈局(這樣纔不會看迷糊),固然若編譯不能經過,就要進行合適的調整。 8. 使用指令: makensis /CD f:\study.nsi" 進行編譯(這個示例腳本我沒試過-_-,若編譯沒法經過只好本身動手研究研究了。我放出來只是用於參考學習) 9. 還沒完—— NSIS 對多語言的支持仍是不夠完美(注意:是完美——有點雞蛋裏挑骨頭的味道)。 咱們繼續: 用 ExeScope (其餘的資源編輯器也行,別說你沒有)打開生成的 study.exe 文件,找到對話框資源的 105 項目。你會發現有一塊很明顯的用以顯示標牌位圖的控件。由於 NSIS 在插件此控件時是使其保持於受權協議文件控件等高的,因此當使用用 modern2.exe 對話框模板時會與對話框頂部多出 45 的距離——不羅嗦了,總之根據須要搞得好看就行(別過火!)。順便提一下,NSIS 安裝目中的 Contrib\UIs 子目錄下提供了多種對話框模板,你能夠自行選用(就是用 ChangeUI 指令或用宏指令),甚至根據須要用資源編輯器修改模板資源。 接着修改:找到 111 項,把裏面的資源漢化掉(新的界面竟然沒有對此對話框的多語言支持!這個對話框只有在大容量的安裝程序執行時才顯示)。 用 ExeScope 更新後,再用 Hex WorkShop 打開我問可憐的試驗品——study.exe,查找字符串「unpacking data: 」(沒引號的,你別瞎加。找不到別怪我 $_$)。找到後處理一下,用「正在解壓縮數據:」 替換(正好 8 個字符 Yeah!)。 10. 如今我要說爲何不啓用 UPX 壓縮以及關閉 CRC 檢測: 用 UPX 壓縮可執行文件頭或啓用 CRC 檢測(起用的話就是打開了自校驗),咱們的 ExeScope 就無用武之地了(除非你夠牛會動態跟蹤技術和反彙編把文件頭殼和自校驗去掉,不然仍是關掉的好)。 至此所有完工。 如有任何語法難點,請參閱 NSIS 的幫助文件。內有上千字的詳細說明(可能更多,我也沒統計過)。還有一些指令我沒有用上,由於那些不太可能用的上。