2014-07-17 2 views
0

요구 사항 1 : 설치 프로그램이 설치 프로그램에서 설치 한 특정 폴더의 파일 만 제거해야합니다 (즉, 설치 후 추가 된 파일은 손상되지 않아야합니다).nsis 고급 제거 로그 - 제거 프로그램을 다른 디렉토리에 두어야합니다

요구 사항 2 : 또한 제거 프로그램이 위에 언급 된 폴더 이외의 특정 위치에 있어야합니다. 제가 드릴 수 없습니다 http://nsis.sourceforge.net/Advanced_Uninstall_Log_NSIS_Header

고급 제거 로그 NSIS 헤더는 매우 유망한 보이지만 는 (아주 잘 요구 사항 1 충족) :

나는 발견하고 여기에있는 "고급 제거 로그 NSIS 헤더"실험 한 요구 사항 2와 함께 사용할 수 있는지 결정하십시오.

헤더를 사용하여 설치된 파일 만 제거하고 .dat 파일이 생성 된 dir이 아닌 다른 dir에서 호출 할 수 있습니까?

미리 감사드립니다.

+0

AdvUninstLog.nsh를 수정 하시겠습니까? 그것은 아마도 수정없이 할 수 있지만 그것은 더 많은 작업이 될 것입니다 ... – Anders

+0

안녕하세요 앤더스 - 그래 나는 AdvUninstLog.nsh을 수정하고자하며 그것을 들여다 보았지만 어디서부터 시작해야할지 모른다. 의견이 있으십니까? (이 토론을위한 적절한 포럼이 아닌 경우 적절한 장소로 나를 리디렉션하십시오.) –

답변

0

AdvUninstLog.nsh에서 UNINST_EXE과 관련된 내용, 특히 WriteUninstaller 줄을 주석 처리해야합니다. .dat와 설치 제거 프로그램을 같은 디렉토리에두고 싶다면 안전한 디렉토리에 별도의 디렉토리를 사용했습니다.

... 
!include AdvUninstLog.nsh 
!insertmacro UNATTENDED_UNINSTALL 
Page Directory 
Page InstFiles 

Function .onInit 

    !insertmacro UNINSTALL.LOG_PREPARE_INSTALL 

FunctionEnd 


Function .onInstSuccess 

    !insertmacro UNINSTALL.LOG_UPDATE_INSTALL 

FunctionEnd 

Section "Main Application" 

    SetOutPath "$InstDir\foo" 
    WriteUninstaller "$InstDir\foo\uninst.exe" 

    SetOutPath "$InstDir\data" 
    !insertmacro UNINSTALL.LOG_OPEN_INSTALL 
    File /r "${NSISDIR}\Plugins\*" ; "random" files 
    !insertmacro UNINSTALL.LOG_CLOSE_INSTALL 

    WriteRegStr ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "InstallDir" "$InstDir" 
    WriteRegStr ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "DisplayName" "${APP_NAME}" 
    WriteRegStr ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "UninstallString" '"$InstDir\foo\uninst.exe"' 

    ; Because the UNINSTALL.LOG_UPDATE_INSTALL macro is responsible for writing the .dat 
    ; it is important to set $InstDir to the directory you want it to be located in. 
    ; This must be done as the last step in your last Section so that $InstDir has 
    ; the correct path when .onInstSuccess is executed. 
    SetOutPath "$InstDir\bar" ; Make sure the directory exists 
    StrCpy $InstDir "$InstDir\bar" 

SectionEnd 

Section UnInstall 

    ; In the uninstaller the initial value of $InstDir is the folder the uninstaller .exe is in. 
    ; In this example I put it in a subfolder so we need to get the root of our install: 
    GetFullPathname $InstDir "$InstDir\..\" 

    ; This is important, it changes $InstDir to the folder where the .dat is located. 
    Push $InstDir ; Save 
    StrCpy $InstDir "$InstDir\bar" 
    !insertmacro UNINSTALL.LOG_BEGIN_UNINSTALL 
    Pop $InstDir ; Restore 

    !insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\data" 
    !insertmacro UNINSTALL.LOG_END_UNINSTALL 
    DeleteRegKey /ifempty ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" 

    ; Because the uninstaller and the .dat were located in their own (unlogged) folders 
    ; we need to manually delete them: 
    Delete "$INSTDIR\foo\uninst.exe" 
    RMDir "$INSTDIR\foo" 
    Delete "$INSTDIR\bar\${UNINSTALL_LOG}.dat" 
    RMDir "$INSTDIR\bar" 

    RMDir "$INSTDIR" 

SectionEnd 
+0

코드 작동이 좋습니다! 아니요. 관련 부품을 내 앱에 넣을 때 어떻게해야하는지 알아야합니다. –