2009-04-05 7 views
9

방금 ​​NSIS을 사용하기 시작했습니다.
아주 잘 작동하지만 문서가 약간 구조화되어 있지 않습니다. NSIS과 함께 새 버전을 설치하기 전에 이전 버전을 제거하도록 사용자에게 요청해야합니까?NSIS로 이전 버전을 제거하려면 어떻게해야합니까?

NSIS (Nullsoft Scriptable Install System)은 Windows 설치 프로그램을 만드는 오픈 소스 시스템입니다.

답변

13

NSIS는 멋진 Windows Installer입니다. NSIS를 사용하여 동일한 애플리케이션의 새 버전을 설치하는 동안 현재 버전을 제거하는 방법은 다음과 같습니다. NSIS 스크립트에 다음 함수를 추가하십시오.

Function .onInit 

     Exec $INSTDIR\uninst.exe 

FunctionEnd 

은 또한 당신은 "새를 설치하기 전에 자동 제거 이전"에 NSIS 위키 this 링크를 확인할 수 있습니다.

+1

+1 링크 –

+2

$ INSTDIR을 사용하지 마십시오. 레지스트리에서 읽은 값을 사용하여 올바른 값인지 확인하십시오. – utapyngo

13

또 다른 방법은 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"