使用 NSIS 安装时,如何在浏览对话框中仅显示本地驱动器和文件夹?

How to show only local drives and folders from the Browse dialog when installing using NSIS?

一旦使用 NSIS 安装时打开浏览对话框,它就会显示驱动程序、文件夹、映射驱动器、可移动驱动器和网络文件夹的列表。如何过滤它并在浏览对话框中仅显示本地驱动器和文件夹?

您无法更改目录页面的工作方式,如果您想过滤文件夹对话框,则必须编写自定义页面和自定义插件。

但是您可以验证目录并阻止用户移动到下一页:

!include LogicLib.nsh
Page Directory
Page InstFiles

!define /IfNDef DRIVE_FIXED 3
Function .onVerifyInstDir
StrCpy [=10=] $InstDir 1 
System::Call 'KERNEL32::GetDriveType(t"[=10=]:\")i.r0'
${If} [=10=] <> ${DRIVE_FIXED}
    Abort
${EndIf}
FunctionEnd

在这种特定情况下,这可能不是一个好主意,因为用户不知道为什么他们不能单击 next/install 按钮。

相反,当用户试图离开页面时,您应该停止并显示一条消息:

!include LogicLib.nsh
Page Directory "" "" ValidateDirPage
Page InstFiles

!define /IfNDef DRIVE_FIXED 3
Function ValidateDirPage
StrCpy [=11=] $InstDir 1 
System::Call 'KERNEL32::GetDriveType(t"[=11=]:\")i.r0'
${If} [=11=] <> ${DRIVE_FIXED}
    MessageBox MB_ICONSTOP "You must specify a local fixed drive for some reason!"
    Abort
${EndIf}
FunctionEnd

注意:一些 USB 存储设备将被识别为固定驱动器。

即使你做了所有这些,你也无法阻止人们安装到不同的驱动器类型。他们可以临时更改驱动器盘符,安装,然后再改回来等等。