首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我想在卸载部分的NSIS脚本中有条件地卸载组件

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

Stack Overflow用户
提问于 2017-02-22 22:18:13
回答 1查看 607关注 0票数 1

我已经使用NSIS脚本为三种不同的环境(QA,UAT和PROD)编写了安装程序和更新程序。这三种环境的安装程序是不同的,但更新程序是相同的。在我的旧安装程序中,卸载程序没有定义,而新更新的安装程序有卸载程序代码。现在我想修改我的Updater,它应该为所有以前安装的环境创建卸载程序,因为我不想运行我的新安装程序。我现在只运行更新。我已经使用'WriteUninstaller‘在’节-post‘中编写了我的卸载程序代码,请参阅下面的代码。此代码将向控制面板程序列表(SSCM)添加三个条目。现在我在我的‘部分UnInstall’中遇到了问题,我想检查用户从控制面板点击了哪个(QA、UAT或PROD)卸载程序。

如何检查用户点击的是哪个环境?这在NSIS脚本中是可能的吗?

我的代码:

代码语言:javascript
复制
!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

卸载时应写入哪些条件检查环境?

EN

回答 1

Stack Overflow用户

发布于 2017-03-01 10:37:33

在编写卸载程序时,还可以使用WriteINIStr将一些额外的标识数据写入同一目录中的文件。然后,您可以使用诸如ReadINIStr $0 "$exedir\appuninstall.ini" "Data" "Id"之类的命令来读取卸载程序中的数据。

也可以将数据附加到卸载程序本身的末尾:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42394047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档