Спросите пользователя о дополнительном местоположении каталога в NSIS

У меня есть скрипт NSIS, который запрашивает у пользователя директорию установки, но я хочу попросить у пользователя еще один временный каталог на новой странице. Есть ли способ, с помощью которого я могу добавить новую страницу, используя nsDialogs, который указывает временный каталог, например, для

C:\temp

а также позволяет им выбрать другой каталог, а затем сохранить значение выбранного каталога в переменной

3 ответа

Если вы просто хотите диалог, похожий на страницу каталога установки, вам не нужно создавать диалог самостоятельно: вы можете просто вызвать MUI_PAGE_DIRECTORY дважды. Пример взят из существующей установки:

!insertmacro MUI_PAGE_DIRECTORY ; <= it will store the selected directory into $INSTDIR

;second directory selection
!define MUI_PAGE_HEADER_SUBTEXT "Choose the folder in which to install the database."
!define MUI_DIRECTORYPAGE_TEXT_TOP "The installer will install the database(s) in the following folder. To install in a differenct folder, click Browse and select another folder. Click Next to continue."
!define MUI_DIRECTORYPAGE_VARIABLE $DbInstDir ; <= the other directory will be stored into that variable
!insertmacro MUI_PAGE_DIRECTORY

Если вам нужно показать второй выбор каталога только в некоторых случаях, вы можете добавить обратный вызов на вторую страницу с помощью

!define MUI_PAGE_CUSTOMFUNCTION_PRE some_custom_function

В этом обратном вызове проверьте, хотите ли вы показать выбор каталога или нет. Если нет, звоню Abort пропустит страницу.

Хотя ответ Секи очень хорош тем, что в нем много повторного использования кода и меньше шаблонов, мне нужно было что-то, что не показывало виджеты «Требуется пространство:», «Требуется пространство:» (например,MUI_PAGE_DIRECTORYделает). Вот пользовательская страница MUI2, которую я придумал:

      ;log dir variable and its default 
Var logDir
!define defaultLogDir "C:\Logs"

;three functions for the custom page
Function pageGetLogDir
   !insertmacro MUI_HEADER_TEXT "Choose Log File Destination" "Choose the folder in which to write the log files."

   nsDialogs::Create 1018
   Pop $0
   ${If} $0 == error
     Abort
   ${EndIf}

   var /global browseButton
   var /global directoryText

   StrCpy $logDir "${defaultLogDir}"

   ${NSD_CreateLabel} 0 0 100% 36u "Log files will be written to the following folder. To have them written to a different folder, click Browse and select another folder. Click Next to continue."
   Pop $0 ; ignore

   ${NSD_CreateText} 0 37u 75% 12u "$logDir"
   pop $directoryText
   ${NSD_OnChange} $directoryText onLogDirTextChange

   ;create button, save handle and connect to function
   ${NSD_CreateBrowseButton} 80% 36u 20% 14u "Browse..."
   pop $browseButton
   ${NSD_OnClick} $browseButton onLogDirButtonClick

   nsDialogs::Show
FunctionEnd

Function onLogDirButtonClick
  nsDialogs::SelectFolderDialog "Select Log File Destination" ""
  Pop $0
  ${If} $0 != error
    StrCpy $logDir $0
    ${NSD_SetText} $directoryText $logDir
  ${EndIf}
FunctionEnd

Function onLogDirTextChange
  ${NSD_GetText} $directoryText $logDir
FunctionEnd

; finally, use that custom page in between your other pages:
Page custom pageGetLogDir

На тот случай, если вы не знаете об этом: установщики NSIS могут создать (или создадут, если используют плагины) временную папку. Вы можете инициализировать его с помощью команды InitPluginsDir

Другие вопросы по тегам