2014-10-06 355 views
0

我幾乎是NSIS的新手;但我遇到了一個問題,我已經查看了我在本網站上可以找到的所有內容,以及使用Google搜索查找答案;到目前爲止,我什麼都沒有。NSIS默認安裝目錄 - 要根據安裝選項進行選擇

我有一個NSIS安裝包,我被要求擴大,以便它將安裝任何四個相關的程序。但是,儘管相關,他們每個人都應該安裝到不同的文件夾。

我有一個MUI_INSTALLOPTIONS_READ,它定義了四個(互斥)單選按鈕,並且工作正常;它會一直等到選擇該選項後才提示安裝位置。但它不會讓我爲每個應用程序設置不同的文件夾。

我在MUI_INSTALLOPTIONS_READ之後的每個分支中做的第一件事是將$ INSTDIR設置爲所選應用程序的默認路徑;所以我希望在調用InstallDir時使用該字符串作爲默認值;但它不 - 它是空白的。

當然,我不能在代碼中的InstallDir之前移動MUI_INSTALLOPTIONS_READ,因爲它必須位於Section中;並且我無法在MUI_INSTALLOPTIONS_READ之後移動InstallDir,因爲它不能位於節(或函數)中。我嘗試拆分包含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

嘗試在leave回調您的自定義頁面或pre回調目錄頁面設置$InstDir。我還建議您爲每個應用程序使用一個部分,然後在進入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 
+0

感謝您的建議。我將不得不花費一些時間研究以找出所有這些東西(「留下回調」,「預回調」,「目錄頁面」,「instfiles頁面」) - 這些名稱給我一個模糊的想法他們是什麼,但我不熟悉他們 - 畢竟是「新手」)。如果我有問題,我會盡快回復您,或者(我希望)讓您知道問題已解決。 – 2014-10-07 12:36:57

+0

就你而言,FIOrDemo是一個創建回調。對於自定義頁面,語法是「Page custom%create%%leave%」,對於普通頁面,它是「Page%name%%pre%%show%leave%,但對於MUI頁面,您必須使用define。 – Anders 2014-10-07 20:04:00

+0

閱讀了一堆手冊,並試圖按照你的建議在「離開」和「前置」回調中分配$ INSTDIR,我覺得它不像新手 - 但仍然無法獲得它會工作,我只是留下來,繼續下去,但我想再次回到井上,看看你是否有機會從你上一篇文章以來想到更多的東西。如果沒有,我感謝你給它一個鏡頭;我試圖找出如何創建第二個自定義頁面來替換標準的InstallDir頁面。 – 2014-10-08 17:18:49