2017-02-22 8 views
0

세 가지 환경 (QA, UAT 및 PROD)에 대해 NSIS 스크립트를 사용하여 Installer 및 Updater를 작성했습니다. 설치 프로그램은 세 가지 환경 모두에서 다르지만 업데이터는 동일합니다. 내 오래된 설치 프로그램에서 제거 프로그램은 정의되지 않았으며 새로 업데이트 된 설치 프로그램에는 제거 프로그램 코드가 있습니다. 이제 새로운 설치 프로그램을 실행하고 싶지 않은 이전에 설치 한 모든 환경에 대해 제거 프로그램을 만들어야하는 방식으로 업데이트 프로그램을 수정하고 싶습니다. 지금은 업데이트 만 실행 중입니다. 'WriteUninstaller'를 사용하여 'Section -post'에 제거 프로그램 코드를 작성했습니다. 아래 코드를 참조하십시오. 이 코드는 제어판 프로그램 목록 (SSCM)에 3 개의 항목을 추가합니다. 이제 나는 (QA 또는 UAT 또는 PROD) 설치 제거 프로그램이 제어판에서 사용자가 클릭했는지 확인하고자하는 'UnInstall'섹션에서 문제를 겪고 있습니다.NSIS 스크립트에서 구성 요소를 조건부로 제거하려면

사용자가 클릭 한 환경을 어떻게 확인해야합니까? 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

제거 프로그램을 작성할 때 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 
:

이 제거 자체의 단부에 데이터를 추가하는 것도 가능하다

관련 문제