NSIS (Nullsoft Scriptable Install System) 是一個很老牌的安裝程式系統,功能上相當齊全,不過有個缺點是只能製作 Windows 的安裝程式
安裝好上面 NSIS 編譯工具及任何一個 IDE 後我們就可以來寫我們的第一個安裝程式~
首先打開安裝好的NSIS 編譯工具應該會看到如下畫面
今天我們就用官方提供的範例來做基本功能的介紹,點選畫面上的 Example scripts ,此時會開啟官方範例的資料夾,我們今天會使用 example2.nsi 來做講解。
在學寫腳本之前,我們先來看看這個範例擁有什麼功能,那我們現在要學的就是將.nsi
的檔案轉換為exe
,這個很簡單,只要在.nsi
的檔案上按右鍵,就會看到有個 Compile NSIS Script 的選項(如下圖)
接著只要指定執行檔的產生路徑,就可以產生執行檔~
接下來就來看看這個範例的內容~
這個安裝檔總共有三個步驟
安裝完成後你可以到安裝的路徑下應該就會看到有這個範例的腳本檔跟一個解除安裝檔(如下圖)
解安裝檔有兩個步驟
接下來就可以將 example2.nsi
打開,如果是使用 Notepad++ 應該會自動選到 NSIS 的語言
基本上我會將整個腳本分成三個區塊來講解
123456789101112131415161718; 安裝程式名稱Name "Example2"; 輸出檔名OutFile "example2.exe"; 執行所需權限RequestExecutionLevel admin; 以 Unicode 編碼的安裝檔Unicode True; 預設安裝路徑InstallDir $PROGRAMFILES\Example2; 安裝識別碼的路徑 (如果重複安裝會覆蓋舊的)InstallDirRegKey HKLM "Software\NSIS_Example2" "Install_Dir"
基本上原本的範例上都有註解了,那這個區塊就是要設定安裝程式的一些基本參數,大概就是組態檔的意思~
常用到的屬性如下
屬性名稱 | 說明 | 範例 |
Name |
安裝檔名稱 | Name "Example" |
Icon | 安裝檔圖示 | Icon "Example.ico" |
OutFile | 安裝腳本產生的執行檔檔名 | OutFile "Example.exe" |
InstallDir | 預設安裝路徑 | InstallDir $PROGRAMFILES\Example |
InstallDirRegKey | 如果有安裝過的話可以取得之前安裝的路徑直接安裝(須配合執行腳本中有WriteRegStr) | InstallDirRegKey HKLM |
RequestExecutionLevel | 執行權限(none|user|highest|admin) | RequestExecutionLevel admin |
LicenseText | 授權文字標題 | LicenseText "ExampleLicense" |
LicenseData | 授權內容(.txt|rtf) | LicenseData "ExampleLicense.txt" |
123456789; 頁面步驟設定Page componentsPage directoryPage instfilesUninstPage uninstConfirmUninstPage instfiles
這一區的內容是在設定安裝\解安裝程式每一個步驟的頁面啦,目前上面的頁面都是內建提供的頁面,當然也可以刻自己想要的畫面,不過這個之後有機會再介紹,今天就先介紹五個內建的頁面可以直接使用(安裝或解安裝步驟都有),或許就可以完成你的安裝包了
再進入內容之前,首先我們要先了解 Section 這個概念,基本上就是可以把你要安裝的程式切成很多塊模組去運行,模組間應該要可以獨立運作,所以我們在 Component 的 Page 就可以讓安裝者去決定說要安裝那些模組在,如果某些模組是必須要安裝,則可以在 Section 中寫 SectionIn RO
來代表。
這一區我們分為兩個部分來看,然後就直接以程式來說明
1234567891011121314151617181920212223242526272829303132; 安裝的東西Section "Example2 (required)"SectionIn RO; 將安裝目錄設為輸出路徑SetOutPath $INSTDIR; 放檔案File "example2.nsi"; 將安裝路徑做登記WriteRegStr HKLM SOFTWARE\NSIS_Example2 "Install_Dir" "$INSTDIR"; 註冊 Windows 解除安裝設定WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "DisplayName" "NSIS Example2"WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "UninstallString" '"$INSTDIR\uninstall.exe"'WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "NoModify" 1WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "NoRepair" 1WriteUninstaller "$INSTDIR\uninstall.exe"SectionEnd; 註冊到開始目錄 (可選)Section "Start Menu Shortcuts"CreateDirectory "$SMPROGRAMS\Example2"CreateShortcut "$SMPROGRAMS\Example2\Uninstall.lnk" "$INSTDIR\uninstall.exe"CreateShortcut "$SMPROGRAMS\Example2\Example2 (MakeNSISW).lnk" "$INSTDIR\example2.nsi"SectionEnd
12345678910111213141516171819Section "Uninstall"; 移除已註冊的解除安裝設定DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2"DeleteRegKey HKLM SOFTWARE\NSIS_Example2; 移除檔案Delete $INSTDIR\example2.nsiDelete $INSTDIR\uninstall.exe; 移除捷徑Delete "$SMPROGRAMS\Example2\*.lnk"; 移除目錄RMDir "$SMPROGRAMS\Example2"RMDir "$INSTDIR"SectionEnd
那這一區塊主要就是要去利用這個NSIS的語法去組出你想要達到的安裝效果,那因為語法真的很多,我這邊就提幾個比較常用的,其他有興趣的話可以到這裡查詢更多語法
12345678${If} $0 == 0StrCpy $Variable "0" ;賦值至變數${ElseIf} $0 == 1StrCpy $Variable "1"${Else}StrCpy $Variable "2"${EndIf}
1234567891011121314151617Function func; 指令...FunctionEndSection; 指令...; 移動到下方 callFunc 這個 labelGoto callFunc; 指令...ReturncallFunc:; 呼叫上方宣告的函式 funcCall funcSectionEnd
以上就是我整理比較常用到的功能,不過因為 NSIS 提供的功能實在很多,而且也可以自己寫控充插件執行,所以如果大家有其他想要做的功能也都可以去文件中找找看。
謝謝大家的閱讀,如果有什麼疑問,都歡迎留言提出來。