代码之家  ›  专栏  ›  技术社区  ›  Marco A.

使用GetParameters的NSIS奇怪行为

  •  1
  • Marco A.  · 技术社区  · 11 年前

    NSIS出现了一个奇怪的错误:

    !include "MUI2.nsh"
    !include "FileFunc.nsh" # To use GetParameters
    
    Name nsDialogs
    OutFile nsDialogs.exe
    
    
    
    Function .onInit
     ${GetParameters} $R0
      MessageBox MB_OK "$R0" 
    FunctionEnd
    
    !insertmacro MUI_PAGE_WELCOME
    
    Section
        DetailPrint "hello world"
    SectionEnd
    

    如果我使用此命令行

    nsDialogs.exe /d=hello
    

    消息框按预期显示:“/d=你好”,但如果我使用

    nsDialogs.exe /D=hello
    

    信息框上写着“”,这是错误的。

    为什么会发生这种情况?

    3 回复  |  直到 11 年前
        1
  •  2
  •   Anders    11 年前

    来自 documentation :

    /D设置默认安装目录($INSTDIR),覆盖 InstallDir和InstallDirRegKey。它 必须是最后一个参数 用于 命令行,并且不能包含任何引号,即使路径 包含空格。仅支持绝对路径。

    这意味着您不能将/D与 ${GetParameters} (/S和/NCRC也是NSIS使用的开关)。NSIS按设计用途 之后的一切 /D=作为 $instdir .

    检测/D的唯一方法是不使用 InstallDir[RegKey] 在脚本中,并检查 $instdir(插入目录) 是!=中的“” .onInit

        2
  •  0
  •   Seki    11 年前

    /D 是命令行参数,用于直接从安装程序命令行调用中定义安装目录。

    请参阅 Installer usage / Common Options 第章了解详细信息。

        3
  •  0
  •   idleberg    11 年前

    我不确定,但我认为NSIS默认会去掉其内置参数。在这种情况下,你可以尝试这样的方法:

    !define myInstDir "$PROGRAMFILES\myApp"
    
    Function .onInit
        ${GetParameters} $R0
        StrCpy $R0 ${myInstDir} +2
        MessageBox MB_OK "$$INSTDIR was changed on runtime"
    FunctionEnd