下面我将从 基本语法、参数处理方法、静默安装参数 和 完整示例 四个方面进行详细说明。

(图片来源网络,侵删)
基本语法
在 NSIS 脚本中,你可以使用特殊的内置变量来获取命令行参数。
$CMDLINE: 这是一个包含所有命令行参数的字符串,包括程序路径本身,如果你运行mysetup.exe /S /D=C:\MyApp,$CMDLINE的值就是"mysetup.exe" "/S" "/D=C:\MyApp"。GetParameters: 这是一个更推荐的函数,它会返回不包含程序路径的参数字符串,对于上面的命令,它会返回"/S" "/D=C:\MyApp"。GetOptions: 这是一个非常实用的函数,用于从参数字符串中提取单个选项及其值。
参数处理方法
使用 GetParameters 和 StrCmp 进行简单判断
这种方法适用于处理几个固定的开关参数(如 /S 表示静默安装)。
; 检查是否传入了 /S 参数
${GetParameters} $0
${If} $0 == "/S"
MessageBox MB_OK "检测到静默安装参数 (/S),将进行静默安装。"
; 在这里调用你的静默安装函数
Call SilentInstall
${ElseIf} $0 == "/V"
MessageBox MB_OK "检测到详细模式参数 (/V)。"
; 在这里调用你的详细安装函数
Call VerboseInstall
${Else}
MessageBox MB_OK "未识别的参数,将进行标准安装。"
; 在这里调用你的标准安装函数
Call StandardInstall
${EndIf}
使用 GetOptions 提取带值的参数
这是处理 /D=安装路径 这种参数的标准方法。
; 定义一个变量来存储安装目录
Var INSTALL_DIR
; 从命令行中获取 /D= 参数
${GetOptions} $0 "/D=" $1
; $1 现在包含了 /D= 后面的值
; StrCmp $1 "" 判断 $1 是否为空字符串
${If} $1 != ""
StrCpy $INSTDIR $1
MessageBox MB_OK "从命令行获取到安装目录: $INSTDIR"
${Else}
; 如果没有提供 /D= 参数,则使用默认值
StrCpy $INSTDIR "$PROGRAMFILES\My Application"
MessageBox MB_OK "未提供安装目录,使用默认目录: $INSTDIR"
${EndIf}
解析多个参数
你可以结合使用 GetParameters 循环和 GetOptions 来处理多个参数。

(图片来源网络,侵删)
Section "MainSection"
; 初始化变量
Var /GLOBAL IS_SILENT
Var / GLOBAL IS_VERBOSE
StrCpy $IS_SILENT "false"
StrCpy $IS_VERBOSE "false"
${GetParameters} $R0
; 循环处理每个参数
${Do}
${GetOptions} $R0 "/S" $R1
${If} $R1 <> ""
StrCpy $IS_SILENT "true"
; 移除已处理的 /S 参数,以便继续查找
StrCpy $R0 $R0
${GetOptions} $R0 "/S" $R1
${EndIf}
${GetOptions} $R0 "/V" $R1
${If} $R1 <> ""
StrCpy $IS_VERBOSE "true"
StrCpy $R0 $R0
${GetOptions} $R0 "/V" $R1
${Else}
; 如果没有找到更多参数,退出循环
${Break}
${EndIf}
${Loop}
${If} $IS_SILENT == "true"
MessageBox MB_OK "将执行静默安装。"
${ElseIf} $IS_VERBOSE == "true"
MessageBox MB_OK "将执行详细安装。"
${EndIf}
; ... 你的安装逻辑 ...
SectionEnd
注意: GetOptions 在 NSIS 的现代版本(如 3.0+)中已经非常强大,通常只需要循环调用它就能解析所有参数,无需手动移除,上面的循环结构是为了展示其原理,在实际使用中,更简洁的写法是直接用 GetOptions 检查特定参数是否存在。
静默安装参数
对于大多数标准的 NSIS 安装程序,静默安装是通过 /S 参数实现的,这个参数通常由 NSIS 的 MUI (Modern User Interface) 插件自动处理。
/S: 执行完全静默的安装,不显示任何界面。/D=: 指定安装目录,即使使用/S,这个参数也通常有效。
如何让你的安装程序支持 /S?
如果你使用了 MUI2 (现代界面),它默认就支持 /S,你只需要在脚本中不强制显示界面即可。

(图片来源网络,侵删)
; 示例:一个支持静默安装的简单脚本
Unicode true
Name "My Application"
OutFile "MyAppInstaller.exe"
RequestExecutionLevel admin
; 现代界面
!include "MUI2.nsh"
; --- 静默安装设置 ---
; 定义一个函数来处理静默安装
Function .onInit
${GetParameters} $R0
${If} $R0 == "/S"
; 如果是静默安装,则设置标志
SetSilent silent
${EndIf}
FunctionEnd
; --- 安装页面 ---
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
; --- 语言 ---
!insertmacro MUI_LANGUAGE "SimpChinese"
; --- 安装逻辑 ---
Section "Install"
; 检查是否静默安装
${If} ${Silent}
MessageBox MB_OK "正在静默安装..."
${Else}
MessageBox MB_OK "正在正常安装..."
${EndIf}
SetOutPath $INSTDIR
File "your_application_file.exe"
WriteUninstaller "$INSTDIR\uninstall.exe"
SectionEnd
Section "Uninstall"
Delete "$INSTDIR\your_application_file.exe"
Delete "$INSTDIR\uninstall.exe"
RMDir "$INSTDIR"
SectionEnd
如何调用静默安装?
在命令行中,只需在安装程序路径后加上 /S 即可:
MyAppInstaller.exe /S
如果还想指定安装目录:
MyAppInstaller.exe /S /D=C:\Program Files\MyApp
完整示例
这是一个完整的、可运行的 NSIS 脚本,它演示了如何接收 /S(静默)、/V(详细)和 /D=(目录)参数,并根据不同的参数组合执行不同的操作。
; NSIS 现代脚本示例 - 接收命令行参数
Unicode true
Name "NSIS 参数接收示例"
OutFile "ParameterExample.exe"
RequestExecutionLevel user ; 为了演示方便,使用user权限
; 包含现代界面
!include "MUI2.nsh"
; --- 定义变量 ---
Var IS_SILENT
Var IS_VERBOSE
Var INSTALL_DIR
; --- 安装页面 ---
!insertmacro MUI_PAGE_WELCOME
Page custom CustomPageShow CustomPageLeave
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
; --- 语言 ---
!insertmacro MUI_LANGUAGE "SimpChinese"
; --- 主安装区 ---
Section "Install"
; 从变量中获取最终的安装目录
StrCpy $INSTDIR $INSTALL_DIR
DetailPrint "正在安装到: $INSTDIR"
${If} $IS_SILENT == "true"
DetailPrint "模式: 静默安装"
${ElseIf} $IS_VERBOSE == "true"
DetailPrint "模式: 详细安装"
${Else}
DetailPrint "模式: 标准安装"
${EndIf}
; 模拟文件复制
SetOutPath $INSTDIR
File "..\README.md" ; 假设脚本目录有一个README.md文件
WriteUninstaller "$INSTDIR\uninstall.exe"
DetailPrint "安装完成!"
SectionEnd
; --- 自定义页面 ---
Function CustomPageShow
; 检查是否是静默安装
${If} $IS_SILENT == "true"
Abort ; 如果是静默安装,跳过此页面
${EndIf}
; 创建自定义界面元素
nsDialogs::Create 1018
Pop $R0
${NSD_CreateLabel} 10u 10u 200u 24u "请确认安装信息:"
Pop $R1
${NSD_CreateLabel} 10u 40u 200u 24u "安装目录:"
Pop $R1
${NSD_CreateText} 80u 40u 250u 12u "$INSTALL_DIR"
Pop $R2
${NSD_CreateLabel} 10u 70u 200u 24u "安装模式:"
Pop $R1
${NSD_CreateLabel} 80u 70u 250u 12u "$MODE_TEXT"
Pop $R1
nsDialogs::Show
FunctionEnd
Function CustomPageLeave
; 可以在这里添加对用户输入的验证
; 检查目录是否存在等
FunctionEnd
; --- 初始化函数 ---
Function .onInit
; 初始化变量
StrCpy $IS_SILENT "false"
StrCpy $IS_VERBOSE "false"
StrCpy $INSTALL_DIR "$PROGRAMFILES\MyApp"
StrCpy $MODE_TEXT "标准"
; 获取所有参数
${GetParameters} $R0
; 解析 /S 参数
${GetOptions} $R0 "/S" $R1
${If} $R1 != ""
StrCpy $IS_SILENT "true"
StrCpy $MODE_TEXT "静默"
${EndIf}
; 解析 /V 参数 (仅在非静默模式下有效)
${If} $IS_SILENT == "false"
${GetOptions} $R0 "/V" $R1
${If} $R1 != ""
StrCpy $IS_VERBOSE "true"
StrCpy $MODE_TEXT "详细"
${EndIf}
${EndIf}
; 解析 /D= 参数
${GetOptions} $R0 "/D=" $R1
${If} $R1 != ""
StrCpy $INSTALL_DIR $R1
${EndIf}
; 如果是静默安装,直接跳到安装页面
${If} $IS_SILENT == "true"
Abort ; .onInit中Abort会跳过所有页面,直接进入安装过程
${EndIf}
FunctionEnd
; --- 卸载部分 ---
Section "Uninstall"
Delete "$INSTDIR\README.md"
Delete "$INSTDIR\uninstall.exe"
RMDir "$INSTDIR"
SectionEnd
如何编译和运行这个示例:
- 将上述代码保存为
ParameterExample.nsi。 - 确保你的 NSIS 安装目录下有
Include\MUI2.nsh文件。 - 在
ParameterExample.nsi同级目录下放一个README.md文件(或修改脚本中的文件名)。 - 使用
makensis.exe编译脚本,生成ParameterExample.exe。 - 在命令行中测试:
- 标准安装:
ParameterExample.exe - 静默安装:
ParameterExample.exe /S - 指定目录安装:
ParameterExample.exe /D=C:\MyApp - 静默+指定目录:
ParameterExample.exe /S /D=C:\MyApp - 详细模式:
ParameterExample.exe /V(会显示自定义页面,但页面信息会反映详细模式)
- 标准安装:
