快捷登錄,享 免費(fèi)下載
首頁 > 軟件列表 > NSIS
NSIS

NSIS

軟件語言:簡體中文
軟件授權(quán):免費(fèi)軟件
適用系統(tǒng):Windows
創(chuàng)建時(shí)間:2020-12-14
軟件廠商/開發(fā)者信息:獨(dú)立開發(fā)者

簡介

NSIS(Nullsoft Scriptable Install System)是一個(gè)專業(yè)開源的制作windows安裝程序的工具。

特點(diǎn)

1、開銷小,一個(gè)完整功能的安裝程序僅需要34k的額外開銷。

2、支持大多數(shù)Windows平臺(tái),包括:Windows9.x,WindowsNT,Windows2000,WindowsXP,Windows2003

3、支持三大壓縮算法:ZLib,BZip2,LZMA

4、支持腳本

5、支持多語言

6、支持安裝界面定制

7、提供可擴(kuò)展的插件接口

8、支持網(wǎng)絡(luò)安裝、補(bǔ)丁

9、支持無人值守的安裝模式

10、此外,NSIS的license允許任何用途免費(fèi)使用。

腳本結(jié)構(gòu)

(下稱nsi腳本)主要包含安裝程序?qū)傩?、頁面、區(qū)段、函數(shù)。

屬性用來定義安裝程序的行為和界面風(fēng)格,這些屬性大部分是編譯時(shí)刻屬性,即不能在運(yùn)行時(shí)刻改變。

頁面是指安裝程序的向?qū)ы撁妗?/p>

示例:

Page license

Page components

Page directory

Page instfiles

Uninst Pageuninst Confirm

Uninst Pageinstfiles

區(qū)段是對應(yīng)某種安裝/卸載選項(xiàng)的處理邏輯,該段代碼僅當(dāng)用戶選擇相應(yīng)的選項(xiàng)才被執(zhí)行。

卸載程序的區(qū)段名用"un."作為前綴。

示例:

Section"Installer Section"

Section End

Section"un.Uninstaller Section"

Section End

在區(qū)段中可以使用很多指令用來完成諸如解壓縮文件、讀寫注冊表、創(chuàng)建目錄、創(chuàng)建快捷方式等任務(wù)。

但最常用的指令是Set Out Path和File。前者用于指定目的位置,后者用于指定文件。

示例:

Section"My Program"

Set Out Path$INSTDIR

File"My Program.exe"

File"Readme.txt"

Section End

區(qū)段名的修飾符“/o”表示該區(qū)段默認(rèn)不選上,“-”表示隱藏區(qū)段(匿名區(qū)段也是隱藏區(qū)段),“!”表

示需要粗體顯示的區(qū)段。

Section In表示該區(qū)段和安裝類型之間的關(guān)系:Section In insttype_index[RO]

RO修飾符表示不可修改。

子區(qū)段用于包含多個(gè)區(qū)段:

Sub Section[/e]Caption[subsection_name in dex output]

修飾符“/e”用于該子區(qū)段的所有區(qū)段是否默認(rèn)展開。

函數(shù)包含了模塊化的安裝邏輯,在nsi腳本中函數(shù)分為兩種:用戶自定義函數(shù)和回調(diào)函數(shù)。

用戶自定義函數(shù)僅當(dāng)是Call指令調(diào)用時(shí)才被執(zhí)行。

如果函數(shù)體中沒有abort語句,則安裝程序執(zhí)行完了用戶自定義函數(shù),繼續(xù)運(yùn)行Call語句和指令。

用戶自定義函數(shù)的語法如下:

Function<函數(shù)名>

#some commands

Function End

函數(shù)的調(diào)用則使用以下語法:

Call<函數(shù)名>

可見無論是函數(shù)的定義還是函數(shù)的調(diào)用都沒有參數(shù)傳遞。

通常nsi的參數(shù)傳遞是通過堆棧操作Pop,Push和20個(gè)寄存器變量$0~$9、$R0~$R9進(jìn)行的。

也可以通過全局變量完成參數(shù)傳遞。

如:

Varinput;

Varoutput;

Sectionbla

DeteailPrint"inputis$input$\n"

Call square

Deteail Print"square of$inputis$output$\n"

Section End

Function square

output=input^2

Function End

回調(diào)函數(shù)則是由在特定的時(shí)間點(diǎn)觸發(fā)的程序段。常用的回調(diào)函數(shù)如.onInit:

Function.onInit

Message Box MB_YESNO"This will install My Program.Do you wish to continue?"IDYESgogogo

Abort

gogogo:

Function End

NSIS對于安裝邏輯定義以下回調(diào)函數(shù):

.onGUIInit

.onInit

.onInst Failed

.onInst Success

.onGUI End

.on Mouse Over Section

.on Reboot Failed

.on Sel Change

.on User Abort

.on Verify InstDir

NSIS對于卸載邏輯定義以下回調(diào)函數(shù):

un.onGUIInit

un.onInit

un.on Uninst Failed

un.on Uninst Success

un.on GUI End

un.onReboot Failed

un.on User Abort

版本

v2.452012.10.01

1、集成了網(wǎng)絡(luò)上能夠收集到的所有插件及應(yīng)用示例;

2、集成了VNISEditv2.03簡體中文版和Note Pad2v3.1簡體中文版兩個(gè)腳本編輯器,并能方便地切換;

3、集成了NSIS文件夾壓縮器、ResourceHacker、Zip2Exe、Ini2Nsi等實(shí)用工具;

4、附帶了NSIS用戶手冊和NSIS圖文教程集錦。

安裝

1、確定安裝的功能和界面元素

2、編寫NSIS腳本

3、使用NSIS提供的makensis或者makensisw程序,將步驟2編寫的腳本編譯成可執(zhí)行的安裝程序

4、調(diào)試安裝程序,如果有問題退到第二步重復(fù)

5、隨著NSIS的流行,有一些第三方的NSIS腳本開發(fā)環(huán)境出現(xiàn)了,如HMNISEdit,VenisIX。

前者是完全開源的,后者僅對個(gè)人和非商業(yè)用途免費(fèi)。在這些集成開發(fā)環(huán)境下,步驟2,3可以方便的組合在一起。

指令

nsi腳本的編譯器指令主要指僅在編譯時(shí)刻執(zhí)行的命令。

這些命令主要用來包含文件、條件化編譯、定義常量、定義宏等。

定義常量和宏是編譯器指令最主要應(yīng)用。

定義常量的示例:

!defineVERSION"1.0.3"

Name"My Program$"

OutFile"My Program Installer-$.exe"

定義宏的示例:

!macro My FuncUN

Function$My Func

Call$DoReg Stuff

Read Reg StrHKLMSoftware\My Programkey

Detai lPrint

Function End

語法解說

注釋

單行注釋用井號(hào)“#”或分號(hào)“;”,跨行注釋用可以用“C/C++”中注釋語法。

9.2數(shù)據(jù)類型

數(shù)字

數(shù)字常量可以用十進(jìn)制、十六進(jìn)制(0x為前綴)、八進(jìn)制(0為前綴)表示。

顏色用類似HTML的中RGB表示法,但去井號(hào)“#”。

字符串

字符串常量可以用引號(hào)引用,轉(zhuǎn)意字符用"$\"作前綴。

美元符號(hào)、常用轉(zhuǎn)意字符換行、回車、制表符的nsi語法表示分別為:$$,$\n,$\r,$\t

續(xù)行符

nsi腳本用行尾的反斜杠“\”表示下一行和當(dāng)前行邏輯上是同一行。

默認(rèn)文件

如果在makensis同目錄下有nsisconf.nsh文件,該文件會(huì)被自動(dòng)包含,除非編譯時(shí)指定/NOCONFIG選項(xiàng)。

標(biāo)號(hào)

nsi使用GOTO語句和IfErrors、Message Box、If Fil eExists及StrCmp進(jìn)行程序控制流表示,標(biāo)號(hào)是這些語句的目標(biāo)語句。

標(biāo)號(hào)定義的語法:標(biāo)號(hào):語句

標(biāo)號(hào)必須定義在函數(shù)和區(qū)段中,其作用范圍僅限于定義它的區(qū)段或函數(shù)。以點(diǎn)號(hào)“.”開頭的標(biāo)號(hào)是全局標(biāo)號(hào)。

相對跳轉(zhuǎn)

nsi 腳本常常使用相對跳轉(zhuǎn)表示條件分枝,其語法是 [+-][1-9],加號(hào)表示從當(dāng)前位置往前跳轉(zhuǎn),減號(hào)則表示從當(dāng)前位置往后跳轉(zhuǎn)。

數(shù)字表示跳轉(zhuǎn)的語句條數(shù)。

示例:

Goto+4

Message BoxMB_OK"The following message will be skipped"

Goto+3

Message BoxMB_OK"You will never ever see this message box"

Goto-3

Message BoxMB_OK"Done"

變量定義

nsi腳本的變量定義用Var關(guān)鍵字,后跟變量名,變量是全局的并且是大小寫不敏感的。變量引用時(shí)需要加上前綴“$”。

除了用戶自定義的變量外,nsi腳本中與定義寄存器變量$0~$9、$R0~$R9用于參數(shù)傳遞,以及系統(tǒng)變量用于特定用途。

這些變量主要有:

$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腳本中可用于調(diào)試的系統(tǒng)函數(shù)有MessageBoxes、DetailPrint、Dumpstate。

ModernUI

ModernUI是感觀上模仿最新的Windows系統(tǒng)的界面風(fēng)格,它由歡迎頁面、結(jié)束頁面和其他向?qū)ы撁鏄?gòu)成。

頁面

向?qū)ы撁媸荖SIS安裝程序中最重要的界面元素,在nsi腳本中可以使用NSIS內(nèi)置頁面或者定制界面,通過腳本可以指定頁面的順序、顯示樣子和行為。Page指令用來定義安裝程序中的頁面,UninstPage用來定義,此外PageEx指令提供類是功能,但提供更多選項(xiàng)。頁面的順序和它在nsi腳本中出現(xiàn)的次序一致。

示例:

Page license

Page components

Page directory

Page instfiles

Uninst Pageuninst Confirm

Uninst Pageinstfiles

規(guī)定安裝程序首先顯示license頁面,然后顯示components選擇頁面,接著顯示安裝目錄選擇頁面。10.1頁面選項(xiàng)

不同的頁面有不同的選項(xiàng):

Licensepage有LicenseText、License Data、License Force Selection;

Components selection頁面有Component Text;

Directory selection頁面有DirText、DirVar(僅能在PageEx中使用)、DirVerify;

Un/Installation log頁面有Details ButtonText、Completed Text;

Uninstall confirmation頁面有DirVar(僅能在PageEx中使用)、UninstallText。

對于內(nèi)置的Page,NSIS支持三個(gè)回調(diào)函數(shù)用于定制界面和驗(yàn)證,對于自定義頁面NSIS支持兩個(gè)回調(diào)函數(shù)。

Page指令語法:

Page license|components|directory|instfiles|uninst Confirm)[pre_function][show_function][leave_function]

或者:

Page custom[creator_function][leave_function][caption]

示例:

Page license skip License""stayInLicense

Page customcus tomPage""":custompage"

Page instfiles

Function skip License

MessageBoxMB_YESNO"Do you want to skip the license page?"IDNOno

Abort

no:

Function End

Function stay In License

MessageBoxMB_YESNO"Do you want to stay in the license page?"IDNOno

Abort

no:

Function End

Function custom Page

Get Temp File Name$R0

File/oname=$R0custom Page.ini

Install Options::dialog$R0

Pop$R1

StrCmp$R1"cancel"done

StrCmp$R1"back"done

StrCmp$R1"success"done

error:Message BoxMB_OK|MB_ICONSTOP"Install Optionserror:$\r$\n$R1"

done:

Function End

Uninst Page指令語法

Uninst Pagecustom[creator_function][leave_function][caption]

UninstPage(license|components|directory|instfiles|uninstConfirm)[pre_function][show_function][leave_function]

Page Ex語法

Page Ex使用嵌套結(jié)構(gòu),比如:

Page Exlicense

License Text "Readme"

License Data readme.rtf

Page Callback slicense Prelicense Show licenseLeave

Page ExEnd

常用指令

nsi大致可以分為基本指令、注冊表及ini操作指令、通用指令、流程控制指令、文件操作指令、卸載指令、字符串處理指令、多語言支持指令、重啟指令。

以下是常用的基本指令:

(1)Delete

Delete[/REBOOTOK]file

(2)Exec

Execcommand

(3)ExecShell

Exec Shellaction command[parameters][SW_SHOWNORMAL|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_HIDE]ExecShell"open"

Exec Wait

Exec Waitcommand

示例:

ExecWait'"$INSTDIR\someprogram.exe"'

Detail Print"some program returned"

(4)File

File[/nonfatal][/a]([/r][/xfile|wildcard[...]](file|wildcard)[...]|/oname=file.datinfile.dat)

/r選項(xiàng)用作遞歸模式,/x用于排出文件

示例:

Filesomething.exe

File/asomething.exe

File*.exe

File/r*.dat

File/rdata

File/oname=$TEMP\temp.datsomefile.ext

File/nonfatal"a file that might not exist"

File/r/xCVSmyproject

File/r/x*.res/x*.obj/x*.pchsource

(5)Rename

Rename[/REBOOTOK]source_filedest_file

(6)RMDir

RMDir[/r][/REBOOTOK]directory_name

解決方法

首先你先將你的一鍵還原,也就是備份系統(tǒng)刪除,這個(gè)可以準(zhǔn)確的說!已經(jīng)沒用了,若是沒有的也算了

然后你肯定有重裝系統(tǒng)盤吧,在重裝盤進(jìn)入安全系統(tǒng)進(jìn)行格式化C盤。

格式化后重啟,再用你重裝盤工具將硬盤分為四個(gè)分區(qū),這樣重裝下系統(tǒng)就可以成功了!這是個(gè)最簡單的方法,也是最可靠的,分區(qū)后就意味著你電腦所有東西都沒了。

插件

nsi支持插件,通過插件可以方便的擴(kuò)展NSIS安裝程序的功能。

NSIS插件是用C++、Delphi等語言編寫的dll,在nsi腳本中調(diào)用nsi中的函數(shù)使用如下語法:

DLLName::FunctionName"參數(shù)1""參數(shù)2""參數(shù)3"

示例1

nsExec::ExecToLog'"$\makensis.exe"/CMDHELP'

執(zhí)行makensis.exe命令,顯示該命令用法。

示例2

Install Options::dialog"$PLUGINSDIR\test.ini"

顯示對話框

插件策略

默認(rèn)情況下NSIS在其安裝目錄的子目錄Plugins中搜索插件,用戶可以使用!add plugin dir指定增加插件的目錄位置。

版本列表