如何在 NSIS 脚本中定义多个目录变量?
How can I define more than one directory variable in NSIS script?
请注意,我创建的单个变量没有问题 here,但是当我尝试创建第二个变量时,出现此错误:
!define: "MUI_DIRECTORYPAGE_VARIABLE" already defined!
这是我设置的适用于单个变量的设置:
Var HW_DATA_DIR
!define MUI_DIRECTORYPAGE_VARIABLE $HW_DATA_DIR
// ...
!define HW_DATA "HW-Data"
## This is the title on the MyApp Directory page
!define MUI_DIRECTORYPAGE_TEXT_TOP "$(MUI_DIRECTORYPAGE_TEXT_TOP_HW)"
;Directory for App files and where config.dat will point to
!define MUI_PAGE_CUSTOMFUNCTION_PRE wel_pre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW dir_pre
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
LangString MUI_DIRECTORYPAGE_TEXT_TOP_HW ${LANG_ENGLSH} "Setup will install \
${HW_DATA} in the following folder..."
## Sections Group 0
Function wel_pre
StrCpy $APP_DIR "C:${HW_DATA}"
strcmp '[=11=]' '1' noabort
messagebox mb_yesno|mb_defbutton2|mb_iconquestion "Leave MyApp directories at default values of C:${HW_DATA} and C:${HW_WORKSPACE}?" idno noabort
strcpy [=11=] 2
abort
noabort:
strcpy [=11=] 1
Functionend
Function dir_pre
GetDlgItem $HWNDPARENT 1037
CreateFont "$(^Font)" "8" "700"
SendMessage ${WM_SETFONT} 0
SetCtlColors '0x000000' '0xFFFFFF'
GetDlgItem $HWNDPARENT 1038
CreateFont "$(^Font)" "8" ""
SendMessage ${WM_SETFONT} 0
SetCtlColors '0x000000' '0xFFFFFF'
Functionend
!define PROG0_InstDir "C:${HW_DATA}"
!define PROG0_StartIndex ${PROG0}
!define PROG0_EndIndex ${SEC0}
SectionGroup /e "MyApp" PROG0
Section "Main" SEC0
CreateDirectory "$HW_DATA"
CreateDirectory "$HW_DATA\Plugins"
CreateDirectory "$HW_DATA\Plugins\ComputePlugin"
CreateDirectory "$HW_DATA\Plugins\ExtensionPlugin"
File /oname=$HW_DATA\Plugins\ComputePlugin\computeplugin.xplot.dll computeplugin.xplot.dll
File /oname=$HW_DATA\Plugins\ExtensionPlugin\hwProxyInterface.MyProApp.dll hwProxyInterface.MyProApp.dll
SectionEnd
这就是我尝试添加第二个变量的方式:
Var HW_DATA_DIR
!define MUI_DIRECTORYPAGE_VARIABLE $HW_DATA_DIR
Var HW_WORKSPACE_DIR
!define MUI_DIRECTORYPAGE_VARIABLE $HW_WORKSPACE_DIR
// ...
!define HW_DATA "HW-Data"
!define HW_WORKSPACE "HW-Workspaces"
## This is the title on the MyApp Directory page
!define MUI_DIRECTORYPAGE_TEXT_TOP "$(MUI_DIRECTORYPAGE_TEXT_TOP_HW)"
;Directory for MyApp files and where config.dat will point to
!define MUI_PAGE_CUSTOMFUNCTION_PRE wel_pre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW dir_pre
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
// ...
LangString MUI_DIRECTORYPAGE_TEXT_TOP_HW ${LANG_ENGLSH} "Setup will install \
${HW_DATA} in the following folder..."
## Sections Group 0
Function wel_pre
StrCpy $HW_DATA_DIR "C:${HW_DATA}"
StrCpy $$HW_WORKSPACE_DIR "C:${HW_WORKSPACE}"
strcmp '[=12=]' '1' noabort
messagebox mb_yesno|mb_defbutton2|mb_iconquestion "Leave Headwave directories at default values of C:${HW_DATA} and C:${HW_WORKSPACE}?" idno noabort
strcpy [=12=] 2
abort
noabort:
strcpy [=12=] 1
Functionend
Function dir_pre
GetDlgItem $HWNDPARENT 1037
CreateFont "$(^Font)" "8" "700"
SendMessage ${WM_SETFONT} 0
SetCtlColors '0x000000' '0xFFFFFF'
GetDlgItem $HWNDPARENT 1038
CreateFont "$(^Font)" "8" ""
SendMessage ${WM_SETFONT} 0
SetCtlColors '0x000000' '0xFFFFFF'
Functionend
!define PROG0_InstDir "C:${HW_DATA}"
!define PROG0_StartIndex ${PROG0}
!define PROG0_EndIndex ${SEC0}
SectionGroup /e "MyApp" PROG0
Section "Main" SEC0
CreateDirectory "$HW_DATA"
CreateDirectory "$HW_DATA\Plugins"
CreateDirectory "$HW_DATA\Plugins\ComputePlugin"
CreateDirectory "$HW_DATA\Plugins\ExtensionPlugin"
File /oname=$HW_DATA\Plugins\ComputePlugin\computeplugin.xplot.dll computeplugin.xplot.dll
File /oname=$HW_DATA\Plugins\ExtensionPlugin\hwProxyInterface.MyProApp.dll hwProxyInterface.MyProApp.dll
CreateDirectory "$HW_WORKSPACE_DIR"
SectionEnd
另请参阅
https://nsis.sourceforge.io/Demonstrating_Page%27s_Custom_Functions_Pre_Show_Leave
https://nsis.sourceforge.io/Two_installations_in_one_installer
有人有什么建议吗?在我的例子中,我碰巧需要为特定应用程序创建一个数据目录和一个工作区目录,使用默认值,但也允许用户将 DATA 目录和 WORKSPACE 目录更改为自定义目录,以防万一,比如说,他们需要在网络驱动器上,而不是在默认的 C:\
驱动器上。 TIA.
目录变量定义是每页设置,必须在页面宏之前设置:
Var foo
Var bar
!define MUI_DIRECTORYPAGE_VARIABLE $foo
insertmacro MUI_PAGE_DIRECTORY
!define MUI_DIRECTORYPAGE_VARIABLE $bar
!insertmacro MUI_PAGE_DIRECTORY
请注意,我创建的单个变量没有问题 here,但是当我尝试创建第二个变量时,出现此错误:
!define: "MUI_DIRECTORYPAGE_VARIABLE" already defined!
这是我设置的适用于单个变量的设置:
Var HW_DATA_DIR
!define MUI_DIRECTORYPAGE_VARIABLE $HW_DATA_DIR
// ...
!define HW_DATA "HW-Data"
## This is the title on the MyApp Directory page
!define MUI_DIRECTORYPAGE_TEXT_TOP "$(MUI_DIRECTORYPAGE_TEXT_TOP_HW)"
;Directory for App files and where config.dat will point to
!define MUI_PAGE_CUSTOMFUNCTION_PRE wel_pre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW dir_pre
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
LangString MUI_DIRECTORYPAGE_TEXT_TOP_HW ${LANG_ENGLSH} "Setup will install \
${HW_DATA} in the following folder..."
## Sections Group 0
Function wel_pre
StrCpy $APP_DIR "C:${HW_DATA}"
strcmp '[=11=]' '1' noabort
messagebox mb_yesno|mb_defbutton2|mb_iconquestion "Leave MyApp directories at default values of C:${HW_DATA} and C:${HW_WORKSPACE}?" idno noabort
strcpy [=11=] 2
abort
noabort:
strcpy [=11=] 1
Functionend
Function dir_pre
GetDlgItem $HWNDPARENT 1037
CreateFont "$(^Font)" "8" "700"
SendMessage ${WM_SETFONT} 0
SetCtlColors '0x000000' '0xFFFFFF'
GetDlgItem $HWNDPARENT 1038
CreateFont "$(^Font)" "8" ""
SendMessage ${WM_SETFONT} 0
SetCtlColors '0x000000' '0xFFFFFF'
Functionend
!define PROG0_InstDir "C:${HW_DATA}"
!define PROG0_StartIndex ${PROG0}
!define PROG0_EndIndex ${SEC0}
SectionGroup /e "MyApp" PROG0
Section "Main" SEC0
CreateDirectory "$HW_DATA"
CreateDirectory "$HW_DATA\Plugins"
CreateDirectory "$HW_DATA\Plugins\ComputePlugin"
CreateDirectory "$HW_DATA\Plugins\ExtensionPlugin"
File /oname=$HW_DATA\Plugins\ComputePlugin\computeplugin.xplot.dll computeplugin.xplot.dll
File /oname=$HW_DATA\Plugins\ExtensionPlugin\hwProxyInterface.MyProApp.dll hwProxyInterface.MyProApp.dll
SectionEnd
这就是我尝试添加第二个变量的方式:
Var HW_DATA_DIR
!define MUI_DIRECTORYPAGE_VARIABLE $HW_DATA_DIR
Var HW_WORKSPACE_DIR
!define MUI_DIRECTORYPAGE_VARIABLE $HW_WORKSPACE_DIR
// ...
!define HW_DATA "HW-Data"
!define HW_WORKSPACE "HW-Workspaces"
## This is the title on the MyApp Directory page
!define MUI_DIRECTORYPAGE_TEXT_TOP "$(MUI_DIRECTORYPAGE_TEXT_TOP_HW)"
;Directory for MyApp files and where config.dat will point to
!define MUI_PAGE_CUSTOMFUNCTION_PRE wel_pre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW dir_pre
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
// ...
LangString MUI_DIRECTORYPAGE_TEXT_TOP_HW ${LANG_ENGLSH} "Setup will install \
${HW_DATA} in the following folder..."
## Sections Group 0
Function wel_pre
StrCpy $HW_DATA_DIR "C:${HW_DATA}"
StrCpy $$HW_WORKSPACE_DIR "C:${HW_WORKSPACE}"
strcmp '[=12=]' '1' noabort
messagebox mb_yesno|mb_defbutton2|mb_iconquestion "Leave Headwave directories at default values of C:${HW_DATA} and C:${HW_WORKSPACE}?" idno noabort
strcpy [=12=] 2
abort
noabort:
strcpy [=12=] 1
Functionend
Function dir_pre
GetDlgItem $HWNDPARENT 1037
CreateFont "$(^Font)" "8" "700"
SendMessage ${WM_SETFONT} 0
SetCtlColors '0x000000' '0xFFFFFF'
GetDlgItem $HWNDPARENT 1038
CreateFont "$(^Font)" "8" ""
SendMessage ${WM_SETFONT} 0
SetCtlColors '0x000000' '0xFFFFFF'
Functionend
!define PROG0_InstDir "C:${HW_DATA}"
!define PROG0_StartIndex ${PROG0}
!define PROG0_EndIndex ${SEC0}
SectionGroup /e "MyApp" PROG0
Section "Main" SEC0
CreateDirectory "$HW_DATA"
CreateDirectory "$HW_DATA\Plugins"
CreateDirectory "$HW_DATA\Plugins\ComputePlugin"
CreateDirectory "$HW_DATA\Plugins\ExtensionPlugin"
File /oname=$HW_DATA\Plugins\ComputePlugin\computeplugin.xplot.dll computeplugin.xplot.dll
File /oname=$HW_DATA\Plugins\ExtensionPlugin\hwProxyInterface.MyProApp.dll hwProxyInterface.MyProApp.dll
CreateDirectory "$HW_WORKSPACE_DIR"
SectionEnd
另请参阅 https://nsis.sourceforge.io/Demonstrating_Page%27s_Custom_Functions_Pre_Show_Leave
https://nsis.sourceforge.io/Two_installations_in_one_installer
有人有什么建议吗?在我的例子中,我碰巧需要为特定应用程序创建一个数据目录和一个工作区目录,使用默认值,但也允许用户将 DATA 目录和 WORKSPACE 目录更改为自定义目录,以防万一,比如说,他们需要在网络驱动器上,而不是在默认的 C:\
驱动器上。 TIA.
目录变量定义是每页设置,必须在页面宏之前设置:
Var foo
Var bar
!define MUI_DIRECTORYPAGE_VARIABLE $foo
insertmacro MUI_PAGE_DIRECTORY
!define MUI_DIRECTORYPAGE_VARIABLE $bar
!insertmacro MUI_PAGE_DIRECTORY