想要在卸载部分的NSIS脚本中有条件地卸载组件

时间:2017-02-22 14:18:13

标签: installer nsis

我已经使用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

检查环境以进行卸载需要写什么条件?

1 个答案:

答案 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