Спросите пользователя о дополнительном местоположении каталога в 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