選單
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 的語言

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

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

; 安裝程式名稱
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
"Software\NSIS_Example" "Install_Dir"
RequestExecutionLevel執行權限(none|user|highest|admin)RequestExecutionLevel admin
LicenseText授權文字標題LicenseText  "ExampleLicense" 
LicenseData授權內容(.txt|rtf)LicenseData "ExampleLicense.txt"

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

; 頁面步驟設定

Page components
Page directory
Page instfiles

UninstPage uninstConfirm
UninstPage instfiles 

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

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

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

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

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

 安裝

; 安裝的東西
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 

 解安裝

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 

那這一區塊主要就是要去利用這個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
${If} $0 == 0
  StrCpy $Variable "0" ;賦值至變數
${ElseIf} $0 == 1
  StrCpy $Variable "1"
${Else}
	StrCpy $Variable "2"
${EndIf} 
 範例2 :Call / Goto / Return
Function func
  ; 指令...
FunctionEnd

Section
  ; 指令...
	; 移動到下方 callFunc 這個 label
  Goto callFunc

  ; 指令...
  Return

callFunc:
	; 呼叫上方宣告的函式 func
  Call func
SectionEnd 
 範例3 :MessageBox
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 

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

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

台電令人向上
webgrease minify 小地雷

相關文章

 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2024/05/19, 週日

Captcha 圖像