Я в значительной степени новичок в NSIS; но у меня есть проблема, и я уже посмотрел все, что могу найти на этом сайте, а также поиск в Google, чтобы искать ответы; и до сих пор у меня ничего нет.Каталог установки NSIS по умолчанию - хотите выбрать на основе опций установки
У меня есть пакет установки NSIS, который меня попросили расширить, чтобы он установил любую из четырех связанных программ. Однако, если они связаны, они должны установить их в другую папку.
У меня есть MUI_INSTALLOPTIONS_READ, которая определяет четыре (взаимоисключающих) переключателя, и это работает нормально; и он будет ждать, пока после этого выбора не будет предложено установить место установки. Но это не позволит мне устанавливать разные папки для каждого приложения.
Первое, что я делаю в каждой ветке после MUI_INSTALLOPTIONS_READ, - установить $ INSTDIR в путь по умолчанию для выбранного приложения; поэтому я ожидал бы использовать эту строку в качестве значения по умолчанию при вызове InstallDir; но это не так - это пусто.
Конечно, я не могу переместить MUI_INSTALLOPTIONS_READ до InstallDir в коде, потому что он должен быть в разделе; и я не могу переместить InstallDir после MUI_INSTALLOPTIONS_READ, потому что он НЕ МОЖЕТ быть в разделе (или функции). Я попытался разделить раздел, содержащий 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» - имена дают мне смутное представление о какие они есть, но я не знаком с ними - «новичок», в конце концов). Я вернусь к вам, если у меня возникнут вопросы, или (я надеюсь), чтобы вы знали, что проблема решена. –
В вашем случае FIOrDemo - это обратный вызов для создания. Для пользовательских страниц синтаксис «Страница изготовлен на заказ% create%% leave%», а для обычных страниц - «Страница% name%% pre%% show%% leave%, но для страниц MUI вы должны использовать определение. быть зарегистрированным. – Anders
Прочитав кучу руководства и попытавшись присвоить $ INSTDIR в запросах «отпуск» и «пре», как вы предложили, я чувствую себя немного менее похожим на новичков, но до сих пор не смог получить это должно сработать. Я просто оставлю это на этом и продолжаю, но я хотел еще раз вернуться к колодцу, чтобы убедиться, что, возможно, вы могли бы подумать о чем-нибудь еще со времени вашего последнего сообщения. Если нет, я благодарю вас за то, что вы сделали это, я пытаюсь понять, как создать вторую настраиваемую страницу для замены стандартной страницы InstallDir. –