Nsis 如何有条件地设置组件页中的第一个InstType

Nsis 如何有条件地设置组件页中的第一个InstType,nsis,Nsis,我想在检查机器上是否已经存在一些文件的基础上,有条件地设置组件页面中的第一个安装类型 我已经尝试过两种不同的方法。1) 使用SetCurInstType,2)在“文件存在”检查的基础上有条件地定义InstType序列顺序 这两种方法都已使用UDF函数进行了测试。该UDF功能也可作为MUI_页面\自定义功能\ MUI_页面\许可证的输入,以及MUI_页面\自定义功能\ MU页面\组件的输入 两项测试都没有按预期进行 方法1) InstType“安装(全部)” InstType“安装(最小)” !定

我想在检查机器上是否已经存在一些文件的基础上,有条件地设置组件页面中的第一个安装类型

我已经尝试过两种不同的方法。1) 使用SetCurInstType,2)在“文件存在”检查的基础上有条件地定义InstType序列顺序

这两种方法都已使用UDF函数进行了测试。该UDF功能也可作为MUI_页面\自定义功能\ MUI_页面\许可证的输入,以及MUI_页面\自定义功能\ MU页面\组件的输入

两项测试都没有按预期进行

方法1)

InstType“安装(全部)”
InstType“安装(最小)”
!定义用户所有安装类型1
!定义用户\u MIN\u INST\u类型2
!定义MUI\u页面\自定义函数\预设置初始化类型
!插入宏MUI_页面_组件
第“1”节第1节
${USER\u ALL\u INST\u TYPE}${USER\u MIN\u INST\u TYPE}中的部分
... 其他代码
分段结束
第2节第2节
${USER\u ALL\u INST\u TYPE}中的节
... 其他代码
分段结束
函数SetInitInstType
IfFileExists“0 endSetInitInstType
SetCurInstType${USER\u MIN\u INST\u TYPE}
endSetInitInstType:
功能端
方法2)

!定义MUI\u页面\自定义函数\预设置初始化类型
!插入宏MUI_页面_组件
第“1”节第1节
${USER\u ALL\u INST\u TYPE}${USER\u MIN\u INST\u TYPE}中的部分
... 其他代码
分段结束
第2节第2节
${USER\u ALL\u INST\u TYPE}中的节
... 其他代码
分段结束
函数SetInitInstType
IfFileExists“0 SetAllInstallType
InstType“安装(最小)”
InstType“安装(全部)”
!定义用户\u MIN\u INST\u类型1
!定义用户所有安装类型2
转到endSetInitInstType
SetAllInstallType:
InstType“安装(全部)”
InstType“安装(最小)”
!定义用户所有安装类型1
!定义用户\u MIN\u INST\u类型2
endSetInitInstType:
功能端
在条件检查之后,如果文件存在,预期的结果是组件页面中的安装模式组合框用“安装(最小)”选项初始化

实际结果如下所示:

方法1)-->禁用所有部分,并使用“自定义”选项初始化安装模式组合框

方法2)-->我在脚本编译期间收到一个错误

Section: "1" ->(Sec1)
SectionIn: Usage: SectionIn InstTypeIdx [InstTypeIdx [...]]
Error in script "<script_name>.nsi" on line XXX -- aborting creation process
部分:“1”->(第1节)
SectionIn:用法:InstTypeIdx[InstTypeIdx[…]中的SectionIn
第XXX行的脚本“.nsi”中出错--正在中止创建过程

如果您有任何建议,我们将不胜感激。

请不要问我为什么,但是中的
部分使用了与所有其他inst类型函数不同的索引系统

与SectionIn不同,索引是基于零的,这意味着第一个安装类型的索引是0


不要问我为什么,但是
中的
部分使用了与所有其他inst类型函数不同的索引系统

与SectionIn不同,索引是基于零的,这意味着第一个安装类型的索引是0


在提出新问题之前,也许可以尝试解决一些以前的问题?好吧,我没有任何悬而未决的问题(在编写脚本编译过程中,我没有任何关于其他方面的错误)。如果你提到我以前在这个论坛上提出的其他问题,我没有关于这些问题的行动要点。我是否以某种方式正式结束了这些问题?如果没有,请告诉我你的意思。非常感谢您不必这样做,但理想情况下,如果答案可以接受,您应该将问题标记为已回答,如果答案不可以,则添加评论和澄清。嗨,安德斯-我找到了指定问题是否已回答的位置,然后我将这些问题标记为已回答。谢谢你提供的信息。回到正题上来,我的代码在这次更改之前工作得非常出色,所以目前我的脚本中没有其他问题。你对此有什么建议吗?谢谢,在问新问题之前,也许可以尝试解决一些以前的问题?好吧,我没有悬而未决的问题(我在脚本编译过程中没有任何关于其他方面的错误)。如果你提到我以前在这个论坛上提出的其他问题,我没有关于这些问题的行动要点。我是否以某种方式正式结束了这些问题?如果没有,请告诉我你的意思。非常感谢您不必这样做,但理想情况下,如果答案可以接受,您应该将问题标记为已回答,如果答案不可以,则添加评论和澄清。嗨,安德斯-我找到了指定问题是否已回答的位置,然后我将这些问题标记为已回答。谢谢你提供的信息。回到正题上来,我的代码在这次更改之前工作得非常出色,所以目前我的脚本中没有其他问题。你对此有什么建议吗?谢谢,洗液很管用。。。还有一个很好的编码解决方案。安德西的作品。。。还有一个很好的编码解决方案。安德斯
!define MUI_PAGE_CUSTOMFUNCTION_PRE SetInitInstType
    !insertmacro MUI_PAGE_COMPONENTS

Section "1" Sec1 
    SectionIn ${USER_ALL_INST_TYPE} ${USER_MIN_INST_TYPE}

    ... other code

SectionEnd

Section "2" Sec2 
    SectionIn ${USER_ALL_INST_TYPE}

    ... other code

SectionEnd

Function SetInitInstType
    IfFileExists "<file_path>" 0 SetAllInstType
    InstType "Install (minimal)"
    InstType "Install (all)"
        !define USER_MIN_INST_TYPE 1
        !define USER_ALL_INST_TYPE 2

    Goto endSetInitInstType

    SetAllInstType:
    InstType "Install (all)"
    InstType "Install (minimal)"
        !define USER_ALL_INST_TYPE 1
        !define USER_MIN_INST_TYPE 2

    endSetInitInstType:
FunctionEnd
Section: "1" ->(Sec1)
SectionIn: Usage: SectionIn InstTypeIdx [InstTypeIdx [...]]
Error in script "<script_name>.nsi" on line XXX -- aborting creation process
!include MUI2.nsh

!define MUI_PAGE_CUSTOMFUNCTION_PRE SetInitInstType
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"

!macro AddInstType name text
!define /IfNDef AddInstType_COUNTER 0
InstType "${text}"
!define INSTTYPE_${name}_IDX ${AddInstType_COUNTER} ; For SetCurInstType etc.
!define /ReDef /Math AddInstType_COUNTER ${AddInstType_COUNTER} + 1
!define INSTTYPE_${name}_SIN ${AddInstType_COUNTER} ; For SectionIn
!macroend

!insertmacro AddInstType ALL "Install (all)"
!insertmacro AddInstType MIN "Install (minimal)"

Section "1 (Both)" Sec1 
SectionIn ${INSTTYPE_ALL_SIN} ${INSTTYPE_MIN_SIN}
SectionEnd

Section "2 (All only)" Sec2 
SectionIn ${INSTTYPE_ALL_SIN}
SectionEnd

Function SetInitInstType
    IfFileExists "$WinDir\Explorer.exe" 0 +2
        SetCurInstType ${INSTTYPE_MIN_IDX}
FunctionEnd

Function .onInit
    Call SetInitInstType ; In case installer is silent, force correct sections
FunctionEnd