帮助文件中关于静默安装的说明

优质
小牛编辑
130浏览
2023-12-01
静默安装在安装过程中不需要用户参与而且不显示用户界面。用户不会看到任何对话且不会被询问任何问题。这对于网络管理员希望不需要用户参与的安装或卸载一些程序,可以快速的对多台电脑执行操作。对于其他的开发者来说,把其他的安装程序整合到自己的安装程序并且把所有需要的信息收集到自己的安装程序而不是显示两个安装程序时是非常有用的。

NSIS 安装程序和卸载程序都可以静默或非静默。当一个安装程序或卸载程序静默时,不是所有的回调函数都被调用。.onGUIInit,.onGUIEnd,它们对应的卸载程序函数和任何涉及到特殊页面或页面类型的回调将不会被调用。

有几种方法来使得安装或卸载程序静默:

第一种

SilentInstall silent
SilentUninstall silent

位置在section 段上方。

第二种

SilentInstall normal|silent|silentlog

指定是否安装程序将是静默的。若是 'silent' 或 'silentlog',全部区段被静悄悄地安装,安装程序将没有任何画面显示。(出错时仍将显示 MessageBoxes ,脚本将仍可以显示它要的任何内容)。注意若设置为 'normal' 而用户以带 /S 开关的命令行方式运行,也将表现为 SilentInstall 'silent' 静默方式。

注意:/S 参数(区分大小写) 

要判断安装、卸载程序是否静默请使用 IfSilent。

首先你需要确认你的安装程序是否真的需要静默模式,在每一个需要用户参与的命令或创建一个窗口命令之前你应该使用 IfSilent 来判断。MessageBox 命令是在静默安装程序最常见的,应该使用 /SD 开关来为静默安装程序指定一个默认的回答。如果你希望你的安装程序可以完全的静默你就应该使用这个开关。使所有内部的 NSIS 信息对话框都有一个静默安装的默认值。silent.nsi实例演示了这个主题的所有方面问题。

引用silent.nsi

# This example shows how to handle silent installers.
# In short, you need IfSilent and the /SD switch for MessageBox to make your installer
# really silent when the /S switch is used.

Name "Silent"
OutFile "silent.exe"
RequestExecutionLevel user

# uncomment the following line to make the installer silent by default.
; SilentInstall silent

Function .onInit
  # `/SD IDYES' tells MessageBox to automatically choose IDYES if the installer is silent
  # in this case, the installer can only be silent if the user used the /S switch or if
  # you've uncommented line number 5
  MessageBox MB_YESNO|MB_ICONQUESTION "Would you like the installer to be silent from now on?" \
    /SD IDYES IDNO no IDYES yes

  # SetSilent can only be used in .onInit and doesn't work well along with `SetSilent silent'

  yes:
    SetSilent silent
    Goto done
  no:
    SetSilent normal
  done:
FunctionEnd

Section
  IfSilent 0 +2
    MessageBox MB_OK|MB_ICONINFORMATION 'This is a "silent" installer'

  # there is no need to use IfSilent for this one because the /SD switch takes care of that
  MessageBox MB_OK|MB_ICONINFORMATION "This is not a silent installer" /SD IDOK

  # when `SetOverwrite on' (which is the default) is used, the installer will show a message
  # if it can't open a file for writing. On silent installers, the ignore option will be
  # automatically selected. if `AllowSkipFiles off' (default is on) was used, there is no
  # ignore option and the cancel option will be automatically selected.

  # on is default
  ; AllowSkipFiles on

  # lock file
  FileOpen $0 $TEMP\silentOverwrite w
  # try to extract - will fail
  File /oname=$TEMP\silentOverwrite silent.nsi
  # unlcok
  FileClose $0

  # this will always show on silent installers because ignore is the option automatically
  # selected when a file can't be opened for writing on a silent installer
  MessageBox MB_OK|MB_ICONINFORMATION "This message box always shows if the installer is silent"

  AllowSkipFiles off

  # lock file
  FileOpen $0 $TEMP\silentOverwrite w
  # try to extract - will fail
  File /oname=$TEMP\silentOverwrite silent.nsi
  # unlcok
  FileClose $0
SectionEnd

因为安装目录选择页面在静默安装的时候不会显示,所以用户可以添加一个命令行选项来指定安装程序安装目录(也可以在非静默安装、卸载程序里使用)。用户只需要使用 /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 里找到。

如果你的安装程序、卸载程序需要大量的信息并且你希望能静默安装,你就应该让用户间建立一个应答文件,把需要的信息都写在里面。这样比把所有的信息都写到命令行里更好一些。