選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
8 分鐘閱讀時間 (1616 個字)

[安裝程式] NSIS - 基礎使用教學

01-06-2021-04-11-51

 前言

NSIS (Nullsoft Scriptable Install System) 是一個很老牌的安裝程式系統,功能上相當齊全,不過有個缺點是只能製作 Windows 的安裝程式

 事前準備

 進入正題

安裝好上面 NSIS 編譯工具及任何一個 IDE 後我們就可以來寫我們的第一個安裝程式~

首先打開安裝好的NSIS 編譯工具應該會看到如下畫面

今天我們就用官方提供的範例來做基本功能的介紹,點選畫面上的 Example scripts ,此時會開啟官方範例的資料夾,我們今天會使用 example2.nsi 來做講解。

 編譯腳本

在學寫腳本之前,我們先來看看這個範例擁有什麼功能,那我們現在要學的就是將.nsi 的檔案轉換為exe,這個很簡單,只要在.nsi 的檔案上按右鍵,就會看到有個 Compile NSIS Script 的選項(如下圖)

接著只要指定執行檔的產生路徑,就可以產生執行檔~

 範例內容

接下來就來看看這個範例的內容~

這個安裝檔總共有三個步驟

  1. 選擇安裝的模組
  2. 設定安裝路徑
  3. 執行安裝

安裝完成後你可以到安裝的路徑下應該就會看到有這個範例的腳本檔跟一個解除安裝檔(如下圖)

解安裝檔有兩個步驟

  1. 顯示解安裝路徑
  2. 執行解安裝

 範例腳本說明

接下來就可以將 example2.nsi 打開,如果是使用 Notepad++ 應該會自動選到 NSIS 的語言

基本上我會將整個腳本分成三個區塊來講解

 第一區 - 安裝檔基本資料設定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Name "Example2"
OutFile "example2.exe"
RequestExecutionLevel admin
 Unicode 
Unicode True
InstallDir $PROGRAMFILES\Example2
 ()
InstallDirRegKey HKLM "Software\NSIS_Example2" "Install_Dir" 
X

基本上原本的範例上都有註解了,那這個區塊就是要設定安裝程式的一些基本參數,大概就是組態檔的意思~

常用到的屬性如下

屬性名稱 說明 範例
Name
安裝檔名稱 Name "Example"
Icon安裝檔圖示Icon "Example.ico"
OutFile安裝腳本產生的執行檔檔名OutFile "Example.exe"
InstallDir預設安裝路徑InstallDir $PROGRAMFILES\Example
InstallDirRegKey如果有安裝過的話可以取得之前安裝的路徑直接安裝(須配合執行腳本中有WriteRegStr)InstallDirRegKey HKLM
"Software\NSIS_Example" "Install_Dir"
RequestExecutionLevel執行權限(none|user|highest|admin)RequestExecutionLevel admin
LicenseText授權文字標題LicenseText  "ExampleLicense" 
LicenseData授權內容(.txt|rtf)LicenseData "ExampleLicense.txt"

 第二區 - 安裝\解安裝步驟設定

1
2
3
4
5
6
7
8
9
Page components
Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles 
X

這一區的內容是在設定安裝\解安裝程式每一個步驟的頁面啦,目前上面的頁面都是內建提供的頁面,當然也可以刻自己想要的畫面,不過這個之後有機會再介紹,今天就先介紹五個內建的頁面可以直接使用(安裝或解安裝步驟都有),或許就可以完成你的安裝包了

  • license : 授權頁面設定搭配第一區的 License 相關設定
  • components : 安裝模組選擇這個部分會搭配第三區的 Section 顯示
  • directory : 安裝路徑設定預設值 : 第一區的 InstallDir
  • uninstConfirm : 解安裝確認
  • instfiles : 執行安裝\解安裝執行的內容為第三區的腳本設定

 第三區 - 安裝\解安裝執行內容

 再進入內容之前,首先我們要先了解 Section 這個概念,基本上就是可以把你要安裝的程式切成很多塊模組去運行,模組間應該要可以獨立運作,所以我們在 Component 的 Page 就可以讓安裝者去決定說要安裝那些模組在,如果某些模組是必須要安裝,則可以在 Section 中寫 SectionIn RO來代表。

這一區我們分為兩個部分來看,然後就直接以程式來說明

 安裝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
西
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" 1
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "NoRepair" 1
  WriteUninstaller "$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 
X

 解安裝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Section "Uninstall"
  
  
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2"
  DeleteRegKey HKLM SOFTWARE\NSIS_Example2
  
  Delete $INSTDIR\example2.nsi
  Delete $INSTDIR\uninstall.exe
  
  Delete "$SMPROGRAMS\Example2\*.lnk"
  
  RMDir "$SMPROGRAMS\Example2"
  RMDir "$INSTDIR"
SectionEnd 
X

那這一區塊主要就是要去利用這個NSIS的語法去組出你想要達到的安裝效果,那因為語法真的很多,我這邊就提幾個比較常用的,其他有興趣的話可以到這裡查詢更多語法

  1. 檔案/資料夾類
  2. 執行類
    • Exec / ExecWait
    • 如果是熟悉 batch 或是 powershell 指令的人就可以直接寫完腳本以後,透過這個當作 UI 也是很方便
  3. 程式邏輯類
    • if / else (範例1)
    • Call / Goto / Return  (範例2)
      • 可以自行寫函式來處理
  4. 訊息類
    • MessageBox (範例3)
      • 彈出視窗
    • DetailPrint
      • 顯示訊息在執行的 Detail 區塊中可以作為 Debug 使用
 範例1 : if / else
1
2
3
4
5
6
7
8
${If} $0 == 0
  StrCpy $Variable "0" ;
${ElseIf} $0 == 1
  StrCpy $Variable "1"
${Else}
    StrCpy $Variable "2"
${EndIf} 
X
 範例2 :Call / Goto / Return
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Function func
  ...
FunctionEnd
Section
  ...
     callFunc  label
  Goto callFunc
  ...
  Return
callFunc:
     func
  Call func
SectionEnd 
X
 範例3 :MessageBox
1
2
3
4
5
6
7
8
9
10
11
12
13
Function func
  ;
  MessageBox MB_OKCANCEL "   " \
    /SD IDOK IDOK label_ok IDCANCEL label_cancel
label_ok:
  MessageBox MB_OK " "
  Goto end
label_cancel:
  MessageBox MB_OK " "
  Goto end
end:
FunctionEnd 
X

 以上就是我整理比較常用到的功能,不過因為 NSIS 提供的功能實在很多,而且也可以自己寫控充插件執行,所以如果大家有其他想要做的功能也都可以去文件中找找看。

謝謝大家的閱讀,如果有什麼疑問,都歡迎留言提出來。

台電令人向上
webgrease minify 小地雷

相關文章

 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2025/05/08, 週四

Captcha 圖像