靜默安裝在安裝過程中不需要用戶參與而且不顯示用戶介面。用戶不會看到任何對話且不會被詢問任何問題。這對於網絡管理員希望不需要用戶參與的安裝或卸載一些程式,這樣可以快速的對多台電腦執行操作。對於其他的開發者來說,把其他的安裝程式整合到自己的安裝程式並且把所有需要的訊息收集到自己的安裝程式而不是顯示兩個安裝程式時非常有用的。
NSIS 安裝程式和卸載程式都可以靜默或非靜默。當一個安裝程式或卸載程式靜默時,不是所有的回調函數都被調用。.onGUIInit,.onGUIEnd,它們對應的卸載程式函數和任何涉及到特殊頁面或頁面類型的回調將不會被調用。
有幾種方法來使得安裝或卸載程式靜默:
要判斷安裝、卸載程式是否靜默請使用 IfSilent。
首先你需要確認你的安裝程式是否真的需要靜默模式,在每一個需要用戶參與的命令或建立一個視窗命令之前你應該使用 IfSilent 來判斷。MessageBox 命令是在靜默安裝程式最常犯的,應該使用 /SD 開關來為靜默安裝程式指定一個預設的回答。如果你希望你的安裝程式可以完全的靜默你就應該使用這個開關。使所有內部的 NSIS 訊息對話框都有一個靜默安裝的預設值。silent.nsi 實例 演示了這個主題的所有方面問題。
因為安裝目錄選擇頁面在靜默安裝的時候不會顯示,所以用戶可以新增一個命令行選項來指定安裝程式安裝目錄(也可以在非靜默安裝、卸載程式裡使用)。用戶只需要使用 /D 開關象下面這樣的例子:
foo.exe /S /D=C:\Program Files\Foo
如果你的安裝程式在靜默模式時需要更多的訊息,你可以讓你的用戶在命令行裡指定並在 .onInit 函數里進行處理,比如:
Function .onInit
Call GetParameters
Pop $2
# 尋找引號 /USERNAME
StrCpy $1 '"'
Push $2
Push '"/USERNAME='
Call StrStr
Pop $0
StrCpy $0 $0 "" 1 # skip quote
StrCmp $0 "" "" next
# 尋找非引號 /USERNAME
StrCpy $1 ' '
Push $2
Push '/USERNAME='
Call StrStr
Pop $0
next:
StrCmp $0 "" done
# 複製 /USERNAME= 後面的值
StrCpy $0 $0 "" 10
# 尋找下一個參數
Push $0
Push $1
Call StrStr
Pop $1
StrCmp $1 "" done
StrLen $1 $1
StrCpy $0 $0 -$1
done:
FunctionEnd
上面的例子將會把 /USERNAME= 後面的值複製到 $0。這樣可以讓用戶在命令行指定必須的參數訊息而不需要用戶參與的用戶介面。用戶可以使用:
foo.exe /S /USERNAME=Bar /D=C:\Program Files\Foo
或:
foo.exe /S "/USERNAME=字串" /D=C:\Program Files\Foo
GetParameters 和 StrStr 可以在 appendix C 裡找到。
如果你的安裝程式、卸載程式需要大量的訊息並且你希望能靜默安裝,你就應該讓用戶間建立一個應答檔案,把需要的訊息都寫在裡面。這樣比把所有的訊息都寫到命令行裡更好一些。