nsis exe如何接收外部传入参数?

99ANYc3cd6
预计阅读时长 28 分钟
位置: 首页 参数 正文

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

nsis exe 接收参数
(图片来源网络,侵删)

基本语法

在 NSIS 脚本中,你可以使用特殊的内置变量来获取命令行参数。

  • $CMDLINE: 这是一个包含所有命令行参数的字符串,包括程序路径本身,如果你运行 mysetup.exe /S /D=C:\MyApp$CMDLINE 的值就是 "mysetup.exe" "/S" "/D=C:\MyApp"
  • GetParameters: 这是一个更推荐的函数,它会返回不包含程序路径的参数字符串,对于上面的命令,它会返回 "/S" "/D=C:\MyApp"
  • GetOptions: 这是一个非常实用的函数,用于从参数字符串中提取单个选项及其值

参数处理方法

使用 GetParametersStrCmp 进行简单判断

这种方法适用于处理几个固定的开关参数(如 /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 来处理多个参数。

nsis exe 接收参数
(图片来源网络,侵删)
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,你只需要在脚本中不强制显示界面即可。

nsis exe 接收参数
(图片来源网络,侵删)
; 示例:一个支持静默安装的简单脚本
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

如何编译和运行这个示例:

  1. 将上述代码保存为 ParameterExample.nsi
  2. 确保你的 NSIS 安装目录下有 Include\MUI2.nsh 文件。
  3. ParameterExample.nsi 同级目录下放一个 README.md 文件(或修改脚本中的文件名)。
  4. 使用 makensis.exe 编译脚本,生成 ParameterExample.exe
  5. 在命令行中测试:
    • 标准安装: ParameterExample.exe
    • 静默安装: ParameterExample.exe /S
    • 指定目录安装: ParameterExample.exe /D=C:\MyApp
    • 静默+指定目录: ParameterExample.exe /S /D=C:\MyApp
    • 详细模式: ParameterExample.exe /V (会显示自定义页面,但页面信息会反映详细模式)
-- 展开阅读全文 --
头像
努比亚z11mini拆机后内部有何玄机?
« 上一篇 今天
智能电视软件应用市场
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]