我几乎是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
感谢您的建议。我将不得不花费一些时间研究以找出所有这些东西(“留下回调”,“预回调”,“目录页面”,“instfiles页面”) - 这些名称给我一个模糊的想法他们是什么,但我不熟悉他们 - 毕竟是“新手”)。如果我有问题,我会尽快回复您,或者(我希望)让您知道问题已解决。 – 2014-10-07 12:36:57
就你而言,FIOrDemo是一个创建回调。对于自定义页面,语法是“Page custom%create%%leave%”,对于普通页面,它是“Page%name%%pre%%show%leave%,但对于MUI页面,您必须使用define。 – Anders 2014-10-07 20:04:00
阅读了一堆手册,并试图按照你的建议在“离开”和“前置”回调中分配$ INSTDIR,我觉得它不像新手 - 但仍然无法获得它会工作,我只是留下来,继续下去,但我想再次回到井上,看看你是否有机会从你上一篇文章以来想到更多的东西。如果没有,我感谢你给它一个镜头;我试图找出如何创建第二个自定义页面来替换标准的InstallDir页面。 – 2014-10-08 17:18:49