Installation 更改NSIS中的默认安装文件夹

Installation 更改NSIS中的默认安装文件夹,installation,nsis,windows-7-x64,Installation,Nsis,Windows 7 X64,我正在使用nsis为windows编写安装程序。此安装程序包含一个在xampp之上运行的web应用程序,因此xampp也作为服务安装在此应用程序中。但当xamp安装在Windows 7上的64位计算机上时,它会出现一个问题。这是由于此处提到的C:\Program Files(x86)中的目录路径问题造成的 但目前自动安装路径在安装程序中设置如下 C:\Program Files (x86)\myapplication 安装程序脚本只有以下宏来添加目录选择器页面 !insertmacro MU

我正在使用nsis为windows编写安装程序。此安装程序包含一个在xampp之上运行的web应用程序,因此xampp也作为服务安装在此应用程序中。但当xamp安装在Windows 7上的64位计算机上时,它会出现一个问题。这是由于此处提到的C:\Program Files(x86)中的目录路径问题造成的

但目前自动安装路径在安装程序中设置如下

C:\Program Files (x86)\myapplication
安装程序脚本只有以下宏来添加目录选择器页面

!insertmacro MUI_PAGE_DIRECTORY
作为解决方案,我要做的是以下操作

  • 将默认目录更改为c:\Program Files
  • 如果用户选择x86文件夹,请发送错误消息以选择其他目录
  • 为此,我需要通过获取安装目录路径

    $INSTDIR
    

  • 检查是否存在具有该路径的x86子字符串
  • 如果是,请给出错误消息
  • 将默认路径更改为c:\Program Files
  • 因为我对nsis不太熟悉,所以我无法编写这个程序


    有人能帮我解决这个问题吗?

    在win7/64上,可以通过
    %ProgramW6432%
    环境变量从32位应用程序获取64位程序文件

    您可以尝试使用
    ReadEnvStr
    获取它:

    • 在32位系统上,它将返回一个空字符串
    • 在64位系统上,它将返回
      c:\program files
      (如果未在别处配置)
    下面是一个测试它的代码片段:

    ReadEnvStr $0 ProgramW6432
    StrCmp $0 "" 0 +3
    MessageBox MB_OK "it is a 32b system"
    goto +2
    MessageBox MB_OK "it is a 64b system"
    
    在您的情况下,它可以:

    ReadEnvStr $0 ProgramW6432
    StrCmp $0 "" +2 0
    StrCpy $INSTDIR $0
    
    编辑:对于拒绝
    程序文件(x86)
    的点,您可以使用Anders为提供的
    。onVerifyInstDir
    回调方法,它将在用户选择时检查choosen目录,然后更改页面:

    Function .onVerifyInstDir
      ReadEnvStr $0 "ProgramFiles(x86)"
      StrCmp $0 $INSTDIR 0 PathGood
      MessageBox MB_OK "directory not valid for installation"
      Abort
    PathGood:
    FunctionEnd
    

    在这里,我使用另一个环境变量来获取程序文件的(x86)变体。

    NSIS提供$PROGRAMFILES32和$PROGRAMFILES64:

    InstallDir "$PROGRAMFILES64\myapp"
    

    这很好,适用于默认路径场景。但是,如果用户手动将目录更改为“C:\ProgramFiles(x86)”该怎么办。这并不能解决当时的问题。你能为那个实例指定一个解决方案吗?对不起,我一定是读得太快了。您想在用户选择目录以拒绝包含“(x86)”的任何文件夹后进行检查吗?如果是,我想我有一个解决方案,我会更新我的答案。感谢Anders和Seki遵循您以前的一个答案。如果使用CPACK,此变量设置为:set(CPACK\u NSIS\u INSTALL\u ROOT“$PROGRAMFILES64”)