NSIS安装程序 - 定义安装程序和系统x32 / x64

时间:2013-10-15 06:17:23

标签: windows path installer 64-bit nsis

我正在尝试为我的应用程序设置正确的安装文件夹。 我是否可以检测安装程序是否适用于32位或64位系统?因为现在当我在x64系统上安装x32应用程序时,InstallDir不正确。

我有一个x32和x64安装程序的构建脚本,我使用 x64.nsh 来定义程序文件路径。但问题是:即使安装程序检测到x64系统,如果当前版本是x32,它仍将安装在“C:\ Program Files”而不是“C:\ Program Files(x86)”中。

在最糟糕的情况下,我将不得不为两个安装程序(x32,x64)创建两个构建脚本,但我想避免它。

那么,有没有办法定义安装程序是针对32位还是64位系统?

2 个答案:

答案 0 :(得分:2)

我有同样的问题。使用包装器脚本结束,该脚本将应用程序的arch传递给nsi脚本(makensis.exe / DARCH = x86 / x64)以及nsi脚本本身中的类似内容:

${If} ${RunningX64}
  ${If} ${ARCH} == "x64"
    StrCpy $InstDir "$PROGRAMFILES64\${PROGNAME}"
  ${Else}
    StrCpy $InstDir "$PROGRAMFILES32\${PROGNAME}"
  ${Endif}
${Else}
  ${If} ${ARCH} == "x64"
    Quit
  ${Else}
    StrCpy $InstDir "$PROGRAMFILES\${PROGNAME}"
  ${Endif}
${EndIf}

答案 1 :(得分:0)

如果您要安装的应用程序始终为32位,则只需使用InstallDir "$ProgramFiles\MyApp"

如果安装程序同时包含同一应用程序的32位和64位版本,并且您要安装“本机”版本,则必须自己在.onInit中设置$ InstDir:

!include LogicLib.nsh
!include x64.nsh
; Don't use InstallDir[RegKey] so $InstDir is empty by default

Function .onInit
${If} $InstDir == "" ; Don't override setup.exe /D=c:\custom\dir
    ${If} ${RunningX64}
        StrCpy $InstDir "$ProgramFiles64\MyCompany\MyApp"
    ${Else}
        StrCpy $InstDir "$ProgramFiles32\MyCompany\MyApp"
    ${EndIf}
${EndIf}
FunctionEnd

Section
SetOutPath $InstDir
${If} ${RunningX64}
    File "AMD64\myapp.exe"
${Else}
    File "i386\myapp.exe"
${EndIf}
SectionEnd