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

Windows NSIS安装程序-定义安装程序和系统x32/x64,windows,path,installation,64-bit,nsis,Windows,Path,Installation,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位系统吗?因为现在我在x64系统上安装x32应用程序时,InstallDir不正确

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

在最坏的情况下,我必须为两个安装程序(x32、x64)创建两个构建脚本,但我想避免它


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

如果您安装的应用程序总是32位的,那么只需使用
InstallDir“$ProgramFiles\MyApp”

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

!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

我也有同样的问题。最终使用了一个包装器脚本,该脚本将应用程序的拱门传递给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}

首先,谢谢你的回答,这很有帮助。然而,问题更为复杂。当我使用你的.onInit函数构建X32安装程序时,当我在X64系统上运行它时,instdir总是“C:\Program Files”,似乎无法更改它。我必须将x32/x64应用程序安装到同一文件夹中,但安装在正确的PROGRAMFILES目录(“C:\Program Files\Company\”或“C:\Program Files(x86)\Company\”)中。我最后制作了两个安装程序:-x32 ver对两个系统使用$PROGRAMFILES32-x64 ver对x64使用$PROGRAMFILES64,并阻止对x32运行