我已经使用NSIS脚本为三种不同的环境(QA,UAT和PROD)编写了Installer和Updater。所有三种环境的安装程序都不同,但更新程序是相同的。在我的旧安装程序中,未定义卸载程序,并且新更新的安装程序具有卸载程序代码。 现在我想修改我的更新程序,它应该为以前安装的所有环境创建卸载程序,因为我不想运行我的新安装程序。我现在只会更新。我使用'WriteUninstaller'在'Section -post'中编写了我的卸载程序代码,请参阅下面的代码。此代码将向控制面板程序列表(SSCM)添加三个条目。现在我在“UnInstall”部分遇到问题,我想检查用户从控制面板点击哪个(QA或UAT或PROD)卸载程序。
我应该如何检查用户点击了哪个环境?是否可以在NSIS脚本中使用?
我的代码:
!define PRODUCT_NAME "Updater name"
!define PRODUCT_NAME_QA "QA Name"
!define PRODUCT_NAME_UAT "UAT Name"
!define PRODUCT_NAME_PROD "PROD Name"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\App.exe"
!define PRODUCT_UNINST_KEY_QA "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME_QA}"
!define PRODUCT_UNINST_KEY_UAT "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME_UAT}"
!define PRODUCT_UNINST_KEY_PROD "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME_PROD}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
Section -Post
IfFileExists "$PROGRAMFILES\App Path\QA\app.exe" QAExists PastQACheck
QAExists:
WriteUninstaller "$PROGRAMFILES\App Path\QA\App Uninstall.exe"
WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$PROGRAMFILES\App Path\QA\App.exe"
WriteRegStr HKLM "${PRODUCT_UNINST_KEY_QA}" \
"DisplayName" "App (QA)"
WriteRegStr HKLM "${PRODUCT_UNINST_KEY_QA}" \
"UninstallString" "$\"$PROGRAMFILES\App Path\QA\App Uninstall.exe$\""
PastQACheck:
IfFileExists "$PROGRAMFILES\App Path\UAT\app.exe" UATExists PastUATCheck
UATExists:
WriteUninstaller "$PROGRAMFILES\App Path\UAT\App Uninstall.exe"
WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$PROGRAMFILES\App Path\UAT\App.exe"
WriteRegStr HKLM "${PRODUCT_UNINST_KEY_UAT}" \
"DisplayName" "App (UAT)"
WriteRegStr HKLM "${PRODUCT_UNINST_KEY_UAT}" \
"UninstallString" "$\"$PROGRAMFILES\App Path\UAT\App Uninstall.exe$\""
PastUATCheck:
IfFileExists "$PROGRAMFILES\App Path\PROD\app.exe" PRODExists PastPRODCheck
PRODExists:
WriteUninstaller "$PROGRAMFILES\App Path\PROD\App Uninstall.exe"
WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$PROGRAMFILES\App Path\PROD\App.exe"
WriteRegStr HKLM "${PRODUCT_UNINST_KEY_PROD}" \
"DisplayName" "App (PROD)"
WriteRegStr HKLM "${PRODUCT_UNINST_KEY_PROD}" \
"UninstallString" "$\"$PROGRAMFILES\App Path\PROD\App Uninstall.exe$\""
PastQACheck:
SectionEnd
Section Uninstall
SetShellVarContext all
;Check if uninstallation called for QA
;Condition to check if user has clicked QA uninstallation
QAExists:
delete "$PROGRAMFILES\App Path\QA\"
delete "$DESKTOP\QA.lnk"
RMDIR "$PROGRAMFILES\App Path\QA\"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY_QA}"
DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
PastQACheck:
;Check if uninstallation called for UAT
;Condition to check if user has clicked UAT uninstallation
UATExists:
delete "$PROGRAMFILES\App Path\UAT\"
delete "$DESKTOP\UAT.lnk"
RMDIR "$PROGRAMFILES\App Path\UAT\"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY_UAT}"
DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
PastUATCheck:
;Check if uninstallation called for PROD
;Condition to check if user has clicked PROD uninstallation
PRODExists:
delete "$PROGRAMFILES\App Path\PROD\"
delete "$DESKTOP\PROD.lnk"
RMDIR "$PROGRAMFILES\App Path\PROD\"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY_PROD}"
DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
PastPRODCheck:
SetAutoClose true
SectionEnd
检查环境以进行卸载需要写什么条件?
答案 0 :(得分:0)
编写卸载程序时,您还可以使用WriteINIStr
将一些额外的标识数据写入同一目录中的文件。然后,您可以使用ReadINIStr $0 "$exedir\appuninstall.ini" "Data" "Id"
之类的内容来读取卸载程序中的数据。
也可以将数据附加到卸载程序本身的末尾:
Section
WriteUninstaller "$InstDir\Uninst.exe"
FileOpen $1 "$InstDir\Uninst.exe" a
FileSeek $1 0 END
FileWrite $1 "CUSTDATA:QA" ; special id
FileClose $1
SectionEnd
Function un.ReadCustomerData
# See http://nsis.sourceforge.net/ReadCustomerData
FunctionEnd
!include LogicLib.nsh
Section Uninstall
Push "CUSTDATA:"
Call un.ReadCustomerData
Pop $0
${If} $0 == "QA"
DeleteRegKey ...
${EndIf}
SectionEnd