NSIS:如果更改了程序名称,如何在安装新版本之前卸载以前的版本?
NSIS: How do I uninstall previous version before install new version if programm name is changed?
在我写入注册表的程序名称中,有一个版本号(例如,它看起来像这样:"My program 3.1")。安装较新版本 3.2 或 3.3(等等)时,我需要卸载旧安装,但我不知道如何让安装程序通过版本号在注册表中找到以前的安装。是的,我学习了这个 link 的示例: http://nsis.sourceforge.net/Auto-uninstall_old_before_installing_new 但是在这个示例中,注册表搜索是通过程序名称执行的。在我的例子中,程序的名称发生了变化,因为版本号发生了变化,安装程序无法再在注册表中找到这个条目来卸载旧版本,然后再安装新版本。请告诉我,我该怎么做。
这是我的示例代码:
;Define main variables:
!define PRODUCT_NAME "My programm"
!define PRODUCT_VERSION "3.9"
!define PRODUCT_FULLNAME "${PRODUCT_NAME} ${PRODUCT_VERSION}"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall${PRODUCT_FULLNAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_UNINSTALL_EXE "uninstall.exe"
;Registry is added by this:
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" '"$INSTDIR${PRODUCT_UNINSTALL_EXE}" _?=$INSTDIR'
;Read the registry key value for uninstall previous installation:
ReadRegStr $R0 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString"
StrCmp $R0 "" done
但是此命令无法在注册表中找到条目,因为程序名称 ${PRODUCT_FULLNAME} 已经有不同的版本号。
请告诉我如何让注册表中的条目只查找程序名称 "My program" 而没有考虑版本号?
重要补充!
在上面的消息中,我忘记澄清一件事:我的安装程序是为安装在多个版本的 3ds Max 中的插件制作的。因此,注册表中的条目如下所示:一个版本的 "My program 3.1 for 3dsMax 2014",另一个版本的 "My program 3.1 for 3dsMax 2018"。安装新版本的程序后,条目应如下所示:"My program 3.2 for 3dsMax 2014" 和 "My program 3.2 for 3dsMax 2018"。也就是说,只有我的程序的版本号应该改变,其他所有内容("My program ..." 和“... for 3dsMax(3ds Max 的版本)”应该保持不变。
感谢您的理解,并提前感谢您的帮助!
使用EnumRegKey
枚举卸载键:
Section
StrLen "${PRODUCT_NAME}"
StrCpy [=10=] 0
loop:
EnumRegKey ${PRODUCT_UNINST_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Uninstall" [=10=]
StrCmp "" done
IntOp [=10=] [=10=] + 1
StrCpy ; Get ${PRODUCT_NAME} prefix
StrCmp "${PRODUCT_NAME}" 0 loop
ReadRegStr ${PRODUCT_UNINST_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Uninstall$1" UninstallString
StrCmp "" loop
ExecWait ; (This assumes you stored the old versions with the _?= parameter)
Goto loop
done:
SectionEnd
在我写入注册表的程序名称中,有一个版本号(例如,它看起来像这样:"My program 3.1")。安装较新版本 3.2 或 3.3(等等)时,我需要卸载旧安装,但我不知道如何让安装程序通过版本号在注册表中找到以前的安装。是的,我学习了这个 link 的示例: http://nsis.sourceforge.net/Auto-uninstall_old_before_installing_new 但是在这个示例中,注册表搜索是通过程序名称执行的。在我的例子中,程序的名称发生了变化,因为版本号发生了变化,安装程序无法再在注册表中找到这个条目来卸载旧版本,然后再安装新版本。请告诉我,我该怎么做。
这是我的示例代码:
;Define main variables:
!define PRODUCT_NAME "My programm"
!define PRODUCT_VERSION "3.9"
!define PRODUCT_FULLNAME "${PRODUCT_NAME} ${PRODUCT_VERSION}"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall${PRODUCT_FULLNAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_UNINSTALL_EXE "uninstall.exe"
;Registry is added by this:
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" '"$INSTDIR${PRODUCT_UNINSTALL_EXE}" _?=$INSTDIR'
;Read the registry key value for uninstall previous installation:
ReadRegStr $R0 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString"
StrCmp $R0 "" done
但是此命令无法在注册表中找到条目,因为程序名称 ${PRODUCT_FULLNAME} 已经有不同的版本号。 请告诉我如何让注册表中的条目只查找程序名称 "My program" 而没有考虑版本号?
重要补充!
在上面的消息中,我忘记澄清一件事:我的安装程序是为安装在多个版本的 3ds Max 中的插件制作的。因此,注册表中的条目如下所示:一个版本的 "My program 3.1 for 3dsMax 2014",另一个版本的 "My program 3.1 for 3dsMax 2018"。安装新版本的程序后,条目应如下所示:"My program 3.2 for 3dsMax 2014" 和 "My program 3.2 for 3dsMax 2018"。也就是说,只有我的程序的版本号应该改变,其他所有内容("My program ..." 和“... for 3dsMax(3ds Max 的版本)”应该保持不变。 感谢您的理解,并提前感谢您的帮助!
使用EnumRegKey
枚举卸载键:
Section
StrLen "${PRODUCT_NAME}"
StrCpy [=10=] 0
loop:
EnumRegKey ${PRODUCT_UNINST_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Uninstall" [=10=]
StrCmp "" done
IntOp [=10=] [=10=] + 1
StrCpy ; Get ${PRODUCT_NAME} prefix
StrCmp "${PRODUCT_NAME}" 0 loop
ReadRegStr ${PRODUCT_UNINST_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Uninstall$1" UninstallString
StrCmp "" loop
ExecWait ; (This assumes you stored the old versions with the _?= parameter)
Goto loop
done:
SectionEnd