2009-04-05 53 views
9

私はちょうどNSISを使い始めました。
非常にうまく動作しますが、ドキュメントが少し構造化されていません。 NSISで新しいバージョンをインストールする前に、以前のバージョンをアンインストールするようにユーザーに要求するにはどうすればよいですか?NSISで以前のバージョンをアンインストールする方法を教えてください

NSIS(Nullsoft Scriptable Install System)は、Windowsインストーラを作成するためのオープンソースシステムです。

答えて

13

NSISは素晴らしいWindowsインストーラです。 NSISを使用して同じアプリケーションの新しいバージョンをインストールする際に、現在のバージョンをアンインストールする方法は次のとおりです。 NSISスクリプトに次の関数を追加します。

Function .onInit 

     Exec $INSTDIR\uninst.exe 

FunctionEnd 

また、あなたは、「自動アンインストール古い新しいをインストールする前に、」上のNSISウィキにthisリンクをチェックアウトすることができます。

+1

+1のリンク –

+2

$ INSTDIRは使用しないでください。あなたが正しいものであることを確認するために、あなたがレジストリから読んだ値を使用してください。 – utapyngo

13

もう1つの方法は、UninstallPrevious隠しセクションを作成し、インストーラの他のすべてのセクションの前に実行させることです。また、アンインストーラをサイレントモードで実行することをお勧めします。

; The "" makes the section hidden. 
Section "" SecUninstallPrevious 

    Call UninstallPrevious 

SectionEnd 

Function UninstallPrevious 

    ; Check for uninstaller. 
    ReadRegStr $R0 HKLM "${HKLM_REG_KEY}" "InstallDir" 

    ${If} $R0 == ""   
     Goto Done 
    ${EndIf} 

    DetailPrint "Removing previous installation."  

    ; Run the uninstaller silently. 
    ExecWait '"$R0\Uninstall.exe /S"' 

    Done: 

FunctionEnd 

このアプローチの利点は、新しいバージョンをインストールする準備が整うまで、古いバージョンをアンインストールしないことです。さらに、古いバージョンをアンインストールすることを決断する必要もなく、魔法のように消えてしまいます。

もちろん、必要に応じて、ユーザーがアンインストールを確認したい場合は、spinner_denの方法を使用してください。

+1

'$ R0'にデータを取得したら、' ExecWait'でそれを使うべきではありませんか? – svrist

+0

私は2年前にそれを書いたが、そうだ。 – cdmckay

1

インストール中に書き込まれるUninstallStringまたはレジストリキーを再利用して、後でアンインストーラコマンドを決定します。

カップルが一番上に定義されています。既にアプリでこれをインストールした場合に存在するであろうあなたの.onInitグラブで、その後

WriteRegStr HKLM "${PROJECT_REG_UNINSTALL_KEY}" "UninstallString" '"$INSTDIR\${PROJECT_UNINSTALL_EXE}" _?=$INSTDIR' 
WriteRegStr HKLM "${PROJECT_REG_UNINSTALL_KEY}" "QuietUninstallString" '"$INSTDIR\${PROJECT_UNINSTALL_EXE}" /S _?=$INSTDIR' 

とレジストリキーの値を(:インストーラSection

!define PROJECT_REG_UNINSTALL_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PROJECT_NAME}" 
!define PROJECT_UNINSTALL_EXE "uninstall.exe" 

${If} ${Silent} 
    ReadRegStr $R0 HKLM "${PROJECT_REG_UNINSTALL_KEY}" "QuietUninstallString" 
${Else} 
    ReadRegStr $R0 HKLM "${PROJECT_REG_UNINSTALL_KEY}" "UninstallString" 
${EndIf} 
ExecWait "$R0" 
関連する問題