NSIS:安装基于32/64位的文件夹

时间:2017-09-10 20:37:06

标签: nsis

我正在处理需要根据操作系统位安装两个文件夹之一的安装程序脚本。到目前为止,选择正常,但出于某种原因,我只在生成的安装程序中看到一个文件夹。

相关部分如下:

;Windows 32 or 64 bit version
!include "x64.nsh"
Section "JRE 64 Bit" Section5
        SectionIn RO

        ;Use the right java version
        DetailPrint "JRE extraction..."
        SetOutPath "$INSTDIR\${APPDIR}\jre"
        File /a /r "${SrcDir}\..\..\jre\jre_64\jre\*.*"
        DetailPrint "JRE extraction complete!"
SectionEnd

Section "JRE 32 Bit" Section6
        SectionIn RO

        ;Use the right java version
        DetailPrint "JRE extraction..."
        SetOutPath "$INSTDIR\${APPDIR}\jre"
        File /a /r "${SrcDir}\..\..\jre\jre_32\jre\*.*"
        DetailPrint "JRE extraction complete!"
SectionEnd

Function .onInit
  #Determine the bitness of the OS and enable the correct section
  IntOp $0 ${SF_SELECTED} | ${SF_RO}
  ${If} ${RunningX64}
    SectionSetFlags ${Section5} $0
    SectionSetFlags ${Section6} ${SECTION_OFF}
  ${Else}
    SectionSetFlags ${Section5} ${SECTION_OFF} 
    SectionSetFlags ${Section6} $0
  ${EndIf}
FunctionEnd

两个文件夹都存在,因为没有警告。但是,我没有看到两个文件夹(jre_64和jre_32),而是在安装程序中看到一个jre文件夹。

Installer Contents

这是预期的行为吗?我使用的是NSIS 2.51。可以找到生成的instaler here

您可以看到完整的脚本here

2 个答案:

答案 0 :(得分:1)

我想这是因为delta压缩,因为两个jre目录应该具有非常相似的内容。使用7-Zip查看时的结构不一定代表安装程序的内部结构,这似乎非常不透明。

我试图找到一个“正确”解压缩安装程序的工具(如Inno Setup的innounp),但没有成功。这证实了NSIS安装程序结构应该是非常不透明的。

您是否进行了一些手动测试以确定安装程序在两种情况下是否按预期工作?

答案 1 :(得分:1)

File指令中使用的路径未存储在安装程序中(如果它是文件夹,则为最后一个路径组件除外),它用于查找开发系统上的文件。您可能知道,SetOutPath设置目标目录,反编译器只能显示该路径的一部分(它们无法解析自定义变量),而您只使用“jre”来存储32位和64位文件夹。

7-zip不是一个完整的反编译器,只能找到找到目标路径名所需的内容,而且它不能理解你的if语句确实选择了两个不同的jre文件夹。

NSIS只存储一次相同的文件,将SetDatablockOptimize off添加到脚本的顶部,安装程序的大小可能会翻倍。