nsis

nsis

NSIS(Nullsoft Scriptable Install System)是一個開源的 Windows 系統下安裝程式製作程式。它提供了安裝、卸載、系統設定、檔案解壓縮等功能。這如其名字所指出的那樣,NSIS 是通過它的腳本語言來描述安裝程式的行為和邏輯的。NSIS 的腳本語言和通常的程式語言有類似的結構和語法,但它是為安裝程式這類套用所設計的。

基本介紹

  • 外文名:Nullsoft Scriptable Install System
  • 名稱縮寫:NSIS
  • 套用平台:Windows
  • 套用類別:安裝程式製作工具
簡介,特點,腳本結構,版本,語法解說,安裝,指令,變數定義,組成部分,頁面,外掛程式,

簡介

NSIS (Nullsoft Scriptable Install System) 是一個專業開源的製作 windows 安裝程式的工具。

特點

1、開銷小,一個完整功能的安裝程式僅需要 34k 的額外開銷。
2、支持大多數 Windows 平台,包括:Windows 10,Windows 8,Widows 7,Windows NT,Windows 2000,Windows XP,Windows 2003
3、支持三大壓縮算法:ZLib,BZip2, LZMA
4、支持腳本
5、支持多語言
6、支持安裝界面定製
7、提供可擴展的外掛程式接口
8、支持網路安裝、補丁
9、支持無人值守的安裝模式
10、此外,NSIS的license允許任何用途免費使用。

腳本結構

(下稱 nsi 腳本)主要包含安裝程式屬性、頁面、區段、函式。
屬性用來定義安裝程式的行為和界面風格,這些屬性大部分是編譯時刻屬性,即不能在運行時刻改變。
頁面是指安裝程式的嚮導頁面。
示例:
Page license
Page components
Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles
區段是對應某種安裝/卸載選項的處理邏輯,該段代碼僅當用戶選擇相應的選項才被執行。
卸載程式的區段名用"un."作 為前綴。
示例:
Section "Installer Section"
SectionEnd
Section "un.Uninstaller Section"
SectionEnd
在區段中可以使用很多指令用來完成諸如解壓縮檔案、讀寫註冊表、創建目錄、創建捷徑等任務。
但最常用的指令是 SetOutPath 和 File。前者用於指定目的位置,後者用於指定檔案。
示例:
Section "My Program"
SetOutPath $INSTDIR
File "My Program.exe"
File "Readme.txt"
SectionEnd
區段名的修飾符“/o”表示該區段默認不選上,“-”表示隱藏區段(匿名區段也是隱藏區段),“!”表
示需要粗體顯示的區段。
SectionIn 表示該區段和安裝類型之間的關係:SectionIn insttype_index [RO]
RO 修飾符表示不可修改。
子區段用於包含多個區段:
SubSection [/e] Caption [subsection_name index output]
修飾符“/e”用於該子區段的所有區段是否默認展開。
函式包含了模組化的安裝邏輯,在 nsi 腳本中函式分為兩種:用戶自定義函式回調函式
用戶自定義函式僅當是 Call 指令調用時才被執行。
如果函式體中沒有abort語句,則安裝程式執行完了用戶自定義函式,繼續運行 Call 語句和指令。
用戶自定義函式的語法如下:
Function <函式名>
# some commands
FunctionEnd
函式的調用則使用以下語法:
Call <函式名>
可見無論是函式的定義還是函式的調用都沒有參數傳遞
通常 nsi 的參數傳遞是通過堆疊操作 Pop,Push 和 20 個暫存器變數 $0~$9、$R0~$R9 進行的。
也可以通過全局變數完成參數傳遞。
如:
Var input ;
Var output ;
Section bla
DeteailPrint "input is $input$\n"
Call square
DeteailPrint "square of $input is $output$\n"
SectionEnd
Function square
output = input^2
FunctionEnd
回調函式則是由在特定的時間點觸發的程式段。常用的回調函式如 .onInit:
Function .onInit
MessageBox MB_YESNO "This will install My Program. Do you wish to continue?" IDYES gogogo
Abort
gogogo:
FunctionEnd
NSIS 對於安裝邏輯定義以下回調函式:
.onGUIInit
.onInit
.onInstFailed
.onInstSuccess
. onGUIEnd
.onMouseOverSection
.onRebootFailed
.onSelChange
.onUserAbort
.onVerifyInstDir
NSIS 對於卸載邏輯定義以下回調函式:
un.onGUIInit
un.onInit
un.onUninstFailed
un.onUninstSuccess
un.onGUIEnd
un.onRebootFailed
un.onUserAbort

版本

v2.45 2012.10.01
1、集成了網路上能夠收集到的所有外掛程式及套用示例;
2、集成了 VNISEdit v2.03 簡體中文版 和 NotePad2 v3.1 簡體中文版兩個腳本編輯器,並能方便地切換;
3、集成了NSIS 資料夾壓縮器、Resource Hacker、Zip2Exe、Ini2Nsi等實用工具;
4、附帶了 NSIS用戶手冊和 NSIS圖文教程集錦。

語法解說

注釋
單行注釋用井號“#”或分號“;”,跨行注釋用可以用“C/C++”中注釋語法。
9.2 數據類型
數字
數字常量可以用十進制、十六進制(0x為前綴)、八進制(0為前綴)表示。
顏色用類似 HTML 的中 RGB 表示法,但去 井號“#”。
字元串
字元串常量可以用引號引用,轉意字元用"$\"作前綴。
美元符號、常用轉意字元換行、回車、制表符的nsi語法表示分別為:$$,$\n,$\r,$\t
續行符
nsi 腳本用行尾的反斜槓“\”表示下一行和當前行邏輯上是同一行。
默認檔案
如果在makensis同目錄下有nsisconf.nsh檔案,該檔案會被自動包含,除非編譯時指定/NOCONFIG選項。
標號
nsi 使用 GOTO 語句和 IfErrors、MessageBox、IfFileExists 及 StrCmp 進行程式控制流表示,標號是這些語句的目標語句。
標號定義的語法:標號:語句
標號必須定義在函式和區段中,其作用範圍僅限於定義它的區段或函式。以點號“.”開頭的標號是全局標號。
相對跳轉
nsi 腳本常常使用相對跳轉表示條件分枝,其語法是 [+-][1-9],加號表示從當前位置往前跳轉,減號則表示從當前位置往後跳轉。
數字表示跳轉的語句條數。
示例:
Goto +4
MessageBox MB_OK "The following message will be skipped"
Goto +3
MessageBox MB_OK "You will never ever see this message box"
Goto -3
MessageBox MB_OK "Done"

安裝

1、確定安裝的功能和界面元素
2、編寫 NSIS 腳本
3、使用 NSIS 提供的 makensis 或者 makensisw 程式,將步驟 2 編寫的腳本編譯成可執行的安裝程式
4、調試安裝程式,如果有問題退到第二步重複
5、隨著 NSIS 的流行,有一些第三方的 NSIS 腳本開發環境出現了,如 HMNISEdit,Venis IX。
前者是完全開源的,後者僅對個人和非商業用途免費。在這些集成開發環境下,步驟2,3可以方便的組合在一起。

指令

nsi 腳本的編譯器指令主要指僅在編譯時刻執行的命令。
這些命令主要用來包含檔案、條件化編譯、定義常量、定義宏等。
定義常量和宏是編譯器指令最主要套用。
定義常量的示例:
!define VERSION "1.0.3"
Name "My Program $"
OutFile "My Program Installer - $.exe"
定義宏的示例:
!macro MyFunc UN
Function $MyFunc
Call $DoRegStuff
ReadRegStr HKLM Software\MyProgram key
DetailPrint
FunctionEnd

變數定義

nsi 腳本的變數定義用 Var 關鍵字,後跟變數名,變數是全局的並且是大小寫不敏感的。變數引用時需要加上前綴“$”。
除了用戶自定義的變數外,nsi 腳本中與定義暫存器變數 $0~$9、$R0~$R9 用於參數傳遞,以及系統變數用於特定用途。
這些變數主要有:
$INSTDIR,$OUTDIR,$CMDLINE,$LANGUAGE 這些變數都是可寫的。
$PROGRAMFILES,$COMMONFILES,$DESKTOP,$EXEDIR,$WINDIR,$SYSDIR,$ TEMP,$STARTMENU
$SMPROGRAMS,$SMSTARTUP,$QUICKLAUNCH,$DOCUMENTS,$SENDTO,$ RECENT,$FAVORITES
$MUSIC,$PICTURES,$VIDEOS,$NETHOOD,$FONTS,$TEMPLATES,$ APPDATA,$PRINTHOOD
$INTERNET_CACHE,$COOKIES,$HISTORY,$PROFILE,$ ADMINTOOLS,$RESOURCES
$RESOURCES_LOCALIZED,$CDBURN_AREA,$HWNDPARENT,$PLUGINSDIR。
nsi 腳本中可用於調試的系統函式有 MessageBoxes、DetailPrint、Dumpstate。

組成部分

Modern UI 是感觀上模仿最新的 Windows 系統的界面風格,它由歡迎頁面、結束頁面和其他嚮導頁面構成。

頁面

嚮導頁面是 NSIS 安裝程式中最重要的界面元素,在 nsi 腳本中可以使用 NSIS 內置頁面或者定製界面,通過腳本可以指定頁面的順序、顯示樣子和行為。Page指令用來定義安裝程式中的頁面,UninstPage用來定義,此外PageEx指令提供類是功能,但提供更多選項。頁面的順序和它在nsi腳本中出現的次序一致。
示例:
Page license
Page components
Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles
規定安裝程式首先顯示license頁面,然後顯示components選擇頁面,接著顯示安裝目錄選擇頁面。
不同的頁面有不同的選項:
License page 有 LicenseText、LicenseData、LicenseForceSelection;
Components selection 頁面有 ComponentText;
Directory selection 頁面有 DirText、DirVar (僅能在 PageEx 中使用)、DirVerify;
Un/Installation log 頁面有 DetailsButtonText、CompletedText;
Uninstall confirmation 頁面有 DirVar (僅能在 PageEx 中使用)、UninstallText。
對於內置的 Page,NSIS 支持三個回調函式用於定製界面和驗證,對於自定義頁面 NSIS 支持兩個回調函式。
Page 指令語法:
Page license|components|directory|instfiles|uninstConfirm) [pre_function] [show_function] [leave_function]
或者:
Page custom [creator_function] [leave_function] [caption]
示例:
Page license skipLicense "" stayInLicense
Page custom customPage "" ": custom page"
Page instfiles
Function skipLicense
MessageBox MB_YESNO "Do you want to skip the license page?" IDNO no
Abort
no:
FunctionEnd
Function stayInLicense
MessageBox MB_YESNO "Do you want to stay in the license page?" IDNO no
Abort
no:
FunctionEnd
Function customPage
File /oname=$R0 customPage.ini
InstallOptions::dialog $R0
Pop $R1
StrCmp $R1 "cancel" done
StrCmp $R1 "back" done
StrCmp $R1 "success" done
error: MessageBox MB_OK|MB_ICONSTOP "InstallOptions error:$\r$\n$R1"
done:
FunctionEnd
UninstPage 指令語法
UninstPage custom [creator_function] [leave_function] [caption]
UninstPage (license|components|directory|instfiles|uninstConfirm) [pre_function] [show_function] [leave_function]
PageEx 語法
PageEx 使用嵌套結構,比如:
PageEx license
LicenseText "Readme"
LicenseData readme.rtf
PageCallbacks licensePre licenseShow licenseLeave
PageExEnd
常用指令
nsi 大致可以分為基本指令、註冊表及 ini 操作指令、通用指令、流程控制指令、檔案操作指令、卸載指令、字元串處理指令、多語言支持指令、重啟指令。
以下是常用的基本指令:
(1) Delete
Delete [/REBOOTOK] file
(2) Exec
Exec command
(3) ExecShell
ExecShell action command [parameters] [SW_SHOWNORMAL | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED | SW_HIDE]ExecShell "open"
ExecWait
ExecWait command
示例:
ExecWait '"$INSTDIR\someprogram.exe"'
DetailPrint "some program returned "
(4) File
File [/nonfatal] [/a] ([/r] [/x file|wildcard [...]] (file|wildcard) [...] | /oname=file.dat infile.dat)
/r選項用作遞歸模式,/x用於排出檔案
示例:
File something.exe
File /a something.exe
File *.exe
File /r *.dat
File /r data
File /oname=$TEMP\temp.dat somefile.ext
File /nonfatal "a file that might not exist"
File /r /x CVS myproject
File /r /x *.res /x *.obj /x *.pch source
(5) Rename
Rename [/REBOOTOK] source_file dest_file
(6) RMDir
RMDir [/r] [/REBOOTOK] directory_name

外掛程式

nsi 支持外掛程式,通過外掛程式可以方便的擴展 NSIS 安裝程式的功能。
NSIS 外掛程式是用 C++、Delphi 等語言編寫的 dll,在 nsi 腳本中調用 nsi 中的函式使用如下語法:
DLLName::FunctionName "參數1" "參數2" "參數3"
示例1
nsExec::ExecToLog '"$\makensis.exe" /CMDHELP'
執行makensis.exe命令,顯示該命令用法。
示例2
InstallOptions::dialog "$PLUGINSDIR\test.ini"
顯示對話框
外掛程式策略
默認情況下 NSIS 在其安裝目錄的子目錄 Plugins 中搜尋外掛程式,用戶可以使用 !addplugindir 指定增加外掛程式的目錄位置。

相關詞條

熱門詞條

聯絡我們