1

从 NSIS 文档中,我们有

root_key subkey key_name 此属性告诉安装程序检查注册表中的字符串,如果该字符串有效,则将其用于安装目录。如果此属性存在,如果注册表项有效,它将覆盖 InstallDir 属性,否则将回退到 InstallDir 默认值。

所以,如果我在.nsi文件中有这些行:

InstallDir "D:\myFolder\myFile"

InstallDirRegKey HKCU "Software\${PRODUCT_COMPANY}\${PRODUCT_NAME}" "Install_Dir"

我知道我将安装目录设置D:\myFolder\myFile为默认目录,但如果Software\${PRODUCT_COMPANY}\${PRODUCT_NAME}是有效路径,那么我将使用它。那是对的吗?

从另一篇文章中,我了解到该InstallDirRegKey指令用于覆盖以前在同一位置的安装。它如何更精确地工作?如果我有以下情况,

InstallDir "D:\myFolder\myFile"

InstallDirRegKey HKCU "D:\myFolder\myFile" "Install_Dir"

NSIS 脚本生成的新.exe文件会覆盖之前的文件吗?或者这是否意味着可执行文件将覆盖前一个?

4

1 回答 1

5

InstallDirRegKey 只从注册表中读取,它从不写入。

在你.onInit被执行之前,NSIS 会:

  1. 如果InstallDir设置,则该路径被复制到$Instdir
  2. 如果InstallDirRegKey 已设置且注册表项存在,则将注册表中的路径(删除文件名)复制到$Instdir

因此,如果您希望 InstallDirRegKey 在用户下次运行安装程序时生效,您必须将其指向安装程序在您的某个部分中创建的密钥。它可以是卸载键中的 UninstallString 命令,也可以是特定于应用程序的键,例如HKLM\Software\My Company\My App.

这样做的全部意义在于,当用户重新安装或安装您的应用程序的新版本时,它将安装在同一文件夹中(覆盖/升级现有安装)。

于 2012-11-18T22:10:02.483 回答