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
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ū)后就意味著你電腦所有東西都沒了。
參考資料 >