NSIS - 强制用户选择不同的目录

Posted

技术标签:

【中文标题】NSIS - 强制用户选择不同的目录【英文标题】:NSIS - force user to select a different directory 【发布时间】:2011-12-09 12:18:29 【问题描述】:

到目前为止,我已经弄清楚了如何通过读取注册表项并测试目录是否存在来检测我以前安装的软件。 (两者都在 NSIS 帮助文件中有详细记录)。如果以前安装了应用程序,现在我想强制用户指定不同的目录。 (不想自己强制卸载,因为以前的版本只是删除所有内容,包括保存的数据)。

据我所知,MUI2.nsh 中有预定义的模板,用于许可证、安装文件夹、进度指示器等。 如何在安装流程的这个阶段添加验证?

更新 - 尝试了 Paul 的解决方案,但它不起作用。 在脚本的顶部,我声明了

!define MUI_PAGE_CUSTOMFUNCTION_LEAVE validateDirectory
!insertmacro MUI_PAGE_DIRECTORY

引用这个函数:

Function validateDirectory
ReadRegStr $R0 HKLM "SOFTWARE\Aadhaar Enrolment Client" "Installdir"
Pop $R0
StrCmp $R0 $OUTDIR +1 +3
MessageBox MB_ICONSTOP|MB_OK 'The directory $OUTDIR already exists.Please choose a different directory.'
Abort
FunctionEnd

此函数显示消息,但不会中止。此外,如果我在目录选择页面中单击“返回”并再次单击“前进”,那么它只是继续安装。

【问题讨论】:

已经有一段时间了...没有解决办法?尤其是不使用 MUI 的? 无..而且我早已不​​再使用 NSIS。 我只想提一下,在 NSIS 论坛的帮助下,我确实让它工作了。 forums.winamp.com/showthread.php?t=380848 使用 MUI,Paul 的解决方案对我来说非常有效(NSIS 2.3,Abort 在这里没有造成任何问题) 【参考方案1】:

你需要像这样为目录页面指定一个“离开”功能

!define MUI_PAGE_CUSTOMFUNCTION_LEAVE LeaveDirectory
!insertmacro MUI_PAGE_DIRECTORY

这将调用单击下一步按钮时指定的函数。

然后使用验证所选目录所需的逻辑创建 LeaveDirectory 函数,如果确定目录无效,只需在函数中调用 Abort,安装程序将不会继续下一步。

文档位于“自定义功能”部分下的this 页面上,但不幸的是,您必须展开“页面自定义功能”标题并不明显。

【讨论】:

谢谢。所以如果我这样做,它会一直保留在目录屏幕上,直到用户选择一个有效的目录? 正确。只要在目录无效时在函数中调用 Abort 就不会跳转到下一页 如果我尝试这个 Abort 不能像这里描述的那样工作,它会使安装程序处于一个错误的状态,所有用户输入都被忽略,被传递到安装程序下面的任何东西,它被降级为任务管理器中的后台进程...但仍然可以使用 Alt-Tab 切换到!很奇怪…… 这个解决方案强制使用 MUI,我还没有使用。我非常希望有一个解决方案。

以上是关于NSIS - 强制用户选择不同的目录的主要内容,如果未能解决你的问题,请参考以下文章

NSIS制作了一个完整的演示产品安装程序

NSIS程序安装包制作

NSIS安装成功是否选择开机自动启动

NSIS安装成功是否选择开机自动启动

NSIS 基于文件夹创建组件

您如何使用 NSIS 请求管理员权限?