2017-02-22 9 views
0

3つの異なる環境(QA、UAT、PROD)のNSISスクリプトを使用してインストーラとアップデータを作成しました。インストーラは3つの環境すべてで異なりますが、アップデータは同じです。私の古いインストーラでは、アンインストーラは定義されておらず、新しくアップデートされたインストーラはアンインストーラコードを持っています。 これで、以前にcozをインストールしたすべての環境でアンインストーラを作成し、新しいインストーラを実行したくないような方法で、アップデータを変更したいと考えています。私は今更新されているだけで走っています。私はアンインストーラのコードを 'Section-post'に 'WriteUninstaller'を使って書いています。以下のコードを見てください。このコードは、コントロールパネルのプログラムリスト(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 

アンインストーラ自体の末尾にデータを追加することも可能です

関連する問題