必威电竞|足球世界杯竞猜平台

nsis
來源:互聯(lián)網(wǎng)

Source的Windows系統(tǒng)下安裝程序制作程序。它提供了安裝、卸載、系統(tǒng)設(shè)置、文件解壓縮等功能。

簡介

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

特點

—開銷小,一個完整功能的安裝程序僅需要 34k 的額外開銷。

—支持大多數(shù) Windows 平臺,包括:Windows 9.x,Windows NT,Windows 2000,Windows XP,Windows 2003

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

—支持腳本

—支持多語言

—支持安裝界面定制

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

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

—支持無人值守的安裝模式

—此外,NSIS的license允許任何用途免費使用。

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

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

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

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

示例:

Page license

Page components

Page directory

Page instfiles

UninstPage uninstConfirm

UninstPage instfiles

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

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

示例:

Section "Installer Section"

SectionEnd

Section "un.Uninstaller Section"

SectionEnd

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

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

示例:

Section "My Program"

SetOutPath $INSTDIR

File "My Program.exe"

File "Readme.txt"

SectionEnd

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

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

SectionIn 表示該區(qū)段和安裝類型之間的關(guān)系:

SectionIn insttype_index [RO]

RO 修飾符表示不可修改。

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

SubSection [/e] Caption [subsection_name index output]

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

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

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

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

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

函數(shù) <函數(shù)名>

# some commands

FunctionEnd

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

Call <函數(shù)名>

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

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

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

如:

Var input ;

Var output ;

Section bla

DeteailPrint "input is $input$\n"

Call square

DeteailPrint "square of $input is $output$\n"

SectionEnd

函數(shù) square

output = input^2

FunctionEnd

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

Function .onInit

MessageBox MB_YESNO "This will install My Program. Do you wish to continue?" IDYES gogogo

Abort

gogogo:

FunctionEnd

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

.onGUIInit

.onInit

.onInstFailed

.onInstSuccess

. onGUIEnd

.onMouseOverSection

.onRebootFailed

.onSelChange

.onUserAbort

.onVerifyInstDir

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

un.onGUIInit

un.onInit

un.onUninstFailed

un.onUninstSuccess

un.onGUIEnd

un.onRebootFailed

un.onUserAbort

腳本編譯器指令

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

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

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

定義常量的示例:

!define VERSION "1.0.3"

Name "My Program $"

OutFile "My Program Installer - $.exe"

定義宏的示例:

!macro MyFunc UN

函數(shù) $MyFunc

Call $DoRegStuff

ReadRegStr HKLM Software\MyProgram key

DetailPrint

FunctionEnd

程序安裝

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

—編寫 NSIS 腳本

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

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

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

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

腳本變量定義

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

除了用戶自定義的變量外,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

$音樂,$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。

Modern UI

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

插件

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

InstallOptions::DIALOG "$PLUGINSDIR\test.ini"

顯示對話框

搜索插件策略

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

腳本基本語法

注釋

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

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

數(shù)字

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

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

字符串

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

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

續(xù)行符

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

默認(rèn)頭文件

如果在makensis同目錄下有nsisconf.nsh文件,該文件會被自動包含,除非編譯時指定/NOCONFIG選項。

標(biāo)號

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

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

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

相對跳轉(zhuǎn)

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

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

示例:

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"

頁面

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

示例:

Page license

Page components

Page directory

Page instfiles

UninstPage uninstConfirm

UninstPage instfiles

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

不同的頁面有不同的選項:

License page 有 LicenseText、LicenseData、LicenseForceSelection;

Components selection 頁面有 ComponentText;

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

Un/Installation log 頁面有 DetailsButtonText、CompletedText;

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

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

Page 指令語法:

Page license|components|directory|instfiles|uninstConfirm) [pre_函數(shù)] [show_function] [leave_function]

或者:

Page custom [creator_function] [leave_function] [caption]

示例:

Page license skipLicense "" stayInLicense

Page custom customPage "" ": custom page"

Page instfiles

函數(shù) 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

函數(shù) customPage

GetTempFileName$R0

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_函數(shù)] [leave_function] [caption]

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

PageEx 語法

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

PageEx license

LicenseText "Readme"

LicenseData readme.rtf

PageCallbacks licensePre licenseShow licenseLeave

PageExEnd

常用的 nsi 指令

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"'

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 電腦視疲勞綜合癥 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

病毒解決方法

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

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

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

參考資料 >

生活家百科家居網(wǎng)