NSIS默认安装目录 - 希望根据安装选项进行选择

时间:2014-10-06 20:06:51

标签: directory nsis prompt

我非常喜欢NSIS;但我有一个问题,我已经看过我在这个网站上可以找到的一切,以及谷歌搜索寻找答案;到目前为止,我什么都没有。

我有一个NSIS安装包,我被要求扩展,以便安装四个相关程序中的任何一个。但是,虽然相关,但它们都应安装到不同的文件夹中。

我有一个MUI_INSTALLOPTIONS_READ,定义了四个(互斥)单选按钮,工作正常;并且它会等到该选择之后才提示安装位置。但它不会让我为每个应用程序设置不同的文件夹。

在MUI_INSTALLOPTIONS_READ之后,我在每个分支中做的第一件事是将$ INSTDIR设置为所选应用程序的默认路径;所以我希望在调用InstallDir时使用该字符串作为默认值;但它没有 - 它是空白的。

当然我不能在代码中的InstallDir之前移动MUI_INSTALLOPTIONS_READ,因为它必须在Section中;我不能在MUI_INSTALLOPTIONS_READ之后移动InstallDir,因为它不能在Section(或Function)中。我试过拆分包含MUI_INSTALLOPTIONS_READ的部分,以便它和下一部分之间有一些空间,并在该空间中插入InstallDir;但这没有改变。

任何人都知道如何做我正在尝试做的事情?感谢您提供的任何建议。

!ifndef PRODUCT_VERSION
  !error "Version required   !  Usage: makensisw.exe /DPRODUCT_VERSION=version scriptfile.nsi"
!endif

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "ProductX"
!define PRODUCT_PUBLISHER "ACME Technologies"
!define PRODUCT_WEB_SITE "http://www.google.com"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_NAME}.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

; MUI 1.67 compatible ------
!include "MUI.nsh"

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Full Install or Demo page
 Page custom FIOrDemo
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE "English"

;Reserve Files
 ReserveFile "appSelect.ini"
  !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS

;   Variables
Var APP1_INSTALL
Var APP2_INSTALL
Var APP3_INSTALL
Var APP4_INSTALL

; MUI end ------


Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Setup.exe"
  InstallDir $INSTDIR
  ; InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
  ShowInstDetails show
  ShowUnInstDetails show

Section "Main    Section" SEC01
 SetOutPath "$INSTDIR"
 SetOverwrite try
 SetShell   VarContext all

  ; pop $0
;   ${While} $0       != "Marker"
;     DetailPrint 'Extra info: $0'
;     pop $0
;   ${EndWhile}
;   Pop $0     ; restore

    !insertmacro MUI_INSTALLOPTIONS_READ $APP2_INSTALL "appSelect.ini" "Field 2" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $APP1_INSTALL "appSelect.ini" "Field 3" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $APP3_INSTALL "appSelect.ini" "Field 4" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $APP4_INSTALL "appSelect.ini" "Field 5" "State"
  DetailPrint 'Install selection $APP2_INSTALL $APP1_INSTALL $APP3_INSTALL $APP4_INSTALL '
     StrCmp $APP1_INSTALL 1 app1_selected
     StrCmp $APP2_INSTALL 1 app2_selected 
     StrCmp $APP3_INSTALL 1 app3_selected
     StrCmp $APP4_INSTALL 1 app4_selected
  Goto continue

app1_selected:
  Strcpy $INSTDIR  "$PROGRAMFILES\Folder1"
  Call InstallApp1
  Goto continue

app2_selected:
  Strcpy $INSTDIR  "$PROGRAMFILES\Folder2"
  Call InstallApp2
  Goto continue

app3_selected:
  Strcpy $INSTDIR  "$PROGRAMFILES\Folder3"
  Call InstallApp3
  Goto continue

app4_selected:
  Strcpy $INSTDIR  "$PROGRAMFILES\Folder4"
  Call InstallApp4
  Goto continue

continue:


SectionEnd


Section -Post
  ; Force reboot after install
  MessageBox MB_ICONINFORMATION|MB_OK "Installation complete.  Your computer will now restart."
  ;  Reboot
SectionEnd

Function InstallApp1
 ;Copy all application files
FunctionEnd

Function InstallApp2
 ;Copy all application files
FunctionEnd

Function InstallApp3
  ;Copy all application files
FunctionEnd

Function InstallApp4
 ;Copy all application files
FunctionEnd

Function .onInit
  ;Extract InstallOptions INI files
    !insertmacro MUI_INSTALLOPTIONS_EXTRACT "appSelect.ini"
FunctionEnd

Function FIOrDemo
    !insertmacro MUI_HEADER_TEXT "Choose Installation Type" ""
    !insertmacro MUI_INSTALLOPTIONS_DISPLAY "appSelect.ini"
FunctionEnd

1 个答案:

答案 0 :(得分:1)

尝试在自定义页面的$InstDir回调中设置leave,或在目录页面设置pre回调。我还建议你为每个应用程序使用一个部分,然后你可以在进入instfiles页面之前完成所有配置。

也可以在sections.nsh中使用组件页面和无线电助手宏而不是自定义页面......

!include MUI.nsh
!include LogicLib.nsh
Page Custom MyCustomPageCreate MyCustomPageLeave
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

Function .onInit
InitPluginsDir
WriteIniStr "$PluginsDir\page.ini" Settings NumFields 2
WriteIniStr "$PluginsDir\page.ini" "Field 1" Type RadioButton
WriteIniStr "$PluginsDir\page.ini" "Field 1" Text "App 1"
WriteIniStr "$PluginsDir\page.ini" "Field 1" State 1
WriteIniStr "$PluginsDir\page.ini" "Field 1" Left 20
WriteIniStr "$PluginsDir\page.ini" "Field 1" Right -10
WriteIniStr "$PluginsDir\page.ini" "Field 1" Top 20
WriteIniStr "$PluginsDir\page.ini" "Field 1" Bottom 40
WriteIniStr "$PluginsDir\page.ini" "Field 2" Type RadioButton
WriteIniStr "$PluginsDir\page.ini" "Field 2" Text "App 2"
WriteIniStr "$PluginsDir\page.ini" "Field 2" Left 20
WriteIniStr "$PluginsDir\page.ini" "Field 2" Right -10
WriteIniStr "$PluginsDir\page.ini" "Field 2" Top 40
WriteIniStr "$PluginsDir\page.ini" "Field 2" Bottom 60
FunctionEnd

Function MyCustomPageCreate
!insertmacro INSTALLOPTIONS_DISPLAY "page.ini"
FunctionEnd

Function MyCustomPageLeave
!insertmacro MUI_INSTALLOPTIONS_READ $0 "page.ini" "Field 1" "State"
${If} $0 <> 0
    StrCpy $InstDir "$ProgramFiles\App1"
${Else}
    StrCpy $InstDir "$ProgramFiles\App2"
${EndIf}
FunctionEnd