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

NSIS: Install a folder based on 32/64 bits

我正在编写一个安装程序脚本,它需要根据 OS 位安装两个文件夹之一。到目前为止,选择没有问题,但出于某种原因,我在生成的安装程序中只看到一个文件夹。

相关部分如下:

;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 [=10=] ${SF_SELECTED} | ${SF_RO}
  ${If} ${RunningX64}
    SectionSetFlags ${Section5} [=10=]
    SectionSetFlags ${Section6} ${SECTION_OFF}
  ${Else}
    SectionSetFlags ${Section5} ${SECTION_OFF} 
    SectionSetFlags ${Section6} [=10=]
  ${EndIf}
FunctionEnd

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

这是预期的行为吗?我正在使用 NSIS 2.51。可以找到生成的安装程序 here.

您可以看到完整的脚本here

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

我试图找到一个工具来 "properly" 解压安装程序(如 innounp 用于 Inno Setup),但没有成功。这证实了 NSIS 安装程序结构应该是真正不透明的。

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

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

7-zip 不是一个完整的反编译器,它只做查找目标路径名所需的工作,它不理解您的 if 语句实际上选择了两个不同的 jre 文件夹。

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