2017-05-25 83 views
-1

嗨下面的程序无法删除应用程序文件,如果不在程序文件中,我的意思是如果用户安装在其他位置。卸载后,注册表值被删除,但不是应用程序文件夹中的文件。任何帮助将非常感激。NSIS卸载程序没有应用程序文件,如果没有安装在程序文件

RequestExecutionLevel admin 
!define MULTIUSER_EXECUTIONLEVEL Admin 
!define MULTIUSER_INSTALLMODE_COMMANDLINE 
!include MultiUser.nsh 
!include FileFunc.nsh 

!ifndef PRODUCT_VERSION 
    !define PRODUCT_VERSION "0.0.0.0" 
!endif 

!ifndef BUILD_TARGET 
    !define BUILD_TARGET "Release" 
!endif 

!define OUT_FILE "PlaytestMateSetup.exe" 

!if ${BUILD_TARGET} == "Debug" 
!define PRODUCT_NAME "Playtest Mate 2.0 Debug" 
!define PRODUCT_WEB_SITE "https://127.0.0.1:3000/" 
!define MUI_ICON "..\PlaytestMate\Resources\Icons\IconRed.ico" 
!endif 

!if ${BUILD_TARGET} == "ReleaseTest" 
!define PRODUCT_NAME "Playtest Mate 2.0 Staging" 
!define PRODUCT_WEB_SITE "https://ca1-ptmstg01.ad.ea.com/" 
!define MUI_ICON "..\PlaytestMate\Resources\Icons\IconBlue.ico" 
!endif 

!if ${BUILD_TARGET} == "Release" 
!define PRODUCT_NAME "Playtest Mate 2.0" 
!define PRODUCT_WEB_SITE "https://ca1-ptmprd01.ad.ea.com/" 
!define MUI_ICON "..\PlaytestMate\Resources\Icons\IconBlack.ico" 
!endif 


!define PRODUCT_PUBLISHER "EA Digital Illusions CE AB" 
!define RUN_REG_KEY "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" 
!define PRODUCT_UNINST_KEY "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" 
!define PRODUCT_INST_KEY "SOFTWARE\${PRODUCT_NAME}" 

;BUILD_DIR and CERT_PATH have to be in relation to the .nsi file 
!define BUILD_DIR "..\..\Bin\${BUILD_TARGET}" 

; PTM-1089 
; CERT settings 
!define CERT_FILE "ea_root.cer" 
!define CERT_PATH "3rdparty\${CERT_FILE}" 
; end PTM-1089 

!include "MUI2.nsh" 

; 64 bit support 
!include x64.nsh 

; MUI Settings 
!define MUI_ABORTWARNING 

!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" 
; Welcome page 
!insertmacro MUI_PAGE_WELCOME 
; Directory page 
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE "DirectoryLeave" 
; Instfiles page 
!insertmacro MUI_PAGE_DIRECTORY 

!insertmacro MUI_PAGE_INSTFILES 
; Finish page 

Function DirectoryLeave 

    # Show message box then take the user back to the Directory page. 
    MessageBox MB_OK|MB_ICONEXCLAMATION "PTM consumes huge space because of the build sizes. We recommend to use a drive have maximum space other than C Drive" 


FunctionEnd 

Function createDesktopShortcut 
    CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\PlaytestMate.exe" "-shortcut" 
FunctionEnd 

!define MUI_FINISHPAGE_SHOWREADME "" 
!define MUI_FINISHPAGE_SHOWREADME_TEXT "Create Desktop Shortcut" 
!define MUI_FINISHPAGE_SHOWREADME_FUNCTION createDesktopShortcut 

; Option to run PTM after install 
!define MUI_FINISHPAGE_RUN "$INSTDIR\PlaytestMate.exe" 

!insertmacro MUI_PAGE_FINISH 

; Uninstaller pages 
!define MUI_PAGE_CUSTOMFUNCTION_SHOW un.ModifyUnWelcome 
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE un.LeaveUnWelcome 
!insertmacro MUI_UNPAGE_WELCOME 
!insertmacro MUI_UNPAGE_INSTFILES 

; Language files 
!insertmacro MUI_LANGUAGE "English" 

; MUI end ------ 

Name "${PRODUCT_NAME}" 
OutFile "${OUT_FILE}" 
VIProductVersion ${PRODUCT_VERSION} 

VIAddVersionKey ProductName "${PRODUCT_NAME} Installer" 
VIAddVersionKey CompanyName "${PRODUCT_PUBLISHER}" 
VIAddVersionKey FileDescription "Installs ${PRODUCT_NAME}" 
VIAddVersionKey FileVersion ${PRODUCT_VERSION} 
VIAddVersionKey ProductVersion ${PRODUCT_VERSION} 
VIAddVersionKey OriginalFilename "${OUT_FILE}" 

InstallDir "$PROGRAMFILES\${PRODUCT_NAME}" 


ShowInstDetails show 
ShowUnInstDetails show 

Function .onInit 
    !insertmacro MULTIUSER_INIT 
    ReadRegStr $R0 HKLM "${PRODUCT_UNINST_KEY}" "QuietUninstallString" 
    StrCmp $R0 "" done uninst 

    ;Run the uninstaller 
    uninst: 
    ClearErrors 
    Exec '$R0' ; instead of the ExecWait line 

    done: 
    ${If} ${RunningX64} 
    ; disable registry redirection (enable access to 64-bit portion of registry) 
    SetRegView 64 
    ; change install dir 
    StrCpy $INSTDIR "$PROGRAMFILES64\${PRODUCT_NAME}" 
    ${Else} 
    MessageBox MB_OK "${PRODUCT_NAME} needs 64-bit Windows" 
    Abort 
    ${EndIf} 

    UserInfo::GetAccountType 
    pop $0 
    ${If} $0 != "admin" ;Require admin rights on NT4+ 
    MessageBox mb_iconstop "${PRODUCT_NAME} requires Administrator privileges" 
    SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED 
    Quit 
    ${EndIf} 
FunctionEnd 

Function .onInstSuccess 
    RMDir /r "$LOCALAPPDATA\${PRODUCT_NAME}" 

    IfSilent startlauncher finished 
    startlauncher: 
    Exec '"$INSTDIR\PlaytestMate.exe"' 
    finished: 
FunctionEnd 

Section "MainSection" SEC01 
    Call EnsureNotRunning 

    Delete "$INSTDIR\*.*" 

    SetOutPath "$INSTDIR" 
    SetOverwrite try 
    File "${BUILD_DIR}\Builds.Core.dll" 
    File "${BUILD_DIR}\Builds.Core.Service.Platform.Origin.dll" 
    File "${BUILD_DIR}\EngineIoClientDotNet.dll" 
    File "${BUILD_DIR}\INIFileParser.dll" 
    File "${BUILD_DIR}\log4net.config" 
    File "${BUILD_DIR}\log4net.dll" 
    File "${BUILD_DIR}\log4net.xml" 
    File "${BUILD_DIR}\Newtonsoft.Json.dll" 
    File "${BUILD_DIR}\Newtonsoft.Json.xml" 
    File "${BUILD_DIR}\PlaytestMate.Core.dll" 
    File "${BUILD_DIR}\PlaytestMate.Core.dll.config" 
    File "${BUILD_DIR}\PlaytestMate.exe" 
    File "${BUILD_DIR}\PlaytestMate.exe.config" 
    File "${BUILD_DIR}\SocketIoClientDotNet.dll" 
    File "${BUILD_DIR}\WebSocket4Net.dll" 
    ; PTM-1089 
    File "${CERT_PATH}" 
    ; end PTM-1089 

    CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" 
    CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\PlaytestMate.exe" "-shortcut" 
    CreateShortCut "$INSTDIR\Show log files.lnk" "$WINDIR\explorer.exe" "%USERPROFILE%\Documents\PlaytestMate" "$WINDIR\system32\imageres.dll" 172 

    ; PTM-1089 you can remove this once we get a proper cert 
    Push "$INSTDIR\${CERT_FILE}" 
    Call AddCertificateToStore 
    Pop $0 
    ${If} $0 != success 
    MessageBox MB_OK "EA Root Certificate import failed: $0" 
    ${EndIf} 
    ; end PTM-1089 
SectionEnd 

Section -AdditionalIcons 
    WriteIniStr "$INSTDIR\${PRODUCT_NAME}.URL" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" 
    CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" 
    CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\uninstall.exe" 
SectionEnd 

Section -Post 
    WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" 
    WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" 
    WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" 
    WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "InstallLocation" "$INSTDIR" 
    WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\PlaytestMate.exe" 
    WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" 
    WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" 

    WriteRegStr HKLM "${PRODUCT_INST_KEY}" "InstallPath" "$INSTDIR\PlaytestMate.exe" 
    WriteRegStr HKLM "${PRODUCT_INST_KEY}" "Version" "${PRODUCT_VERSION}" 

    ; estimated size 
    ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 
    IntFmt $0 "0x%08X" $0 
    WriteRegDWORD HKLM "${PRODUCT_UNINST_KEY}" "EstimatedSize" "$0" 

    WriteRegDWORD HKLM "${PRODUCT_UNINST_KEY}" "VersionMajor" 2 
    WriteRegDWORD HKLM "${PRODUCT_UNINST_KEY}" "VersionMinor" 0 

    ; Runs PTM on Windows start-up 
    WriteRegStr HKLM "${RUN_REG_KEY}" "PlaytestMate" "$INSTDIR\PlaytestMate.exe" 

    WriteUninstaller "$INSTDIR\uninstall.exe" 
SectionEnd 


!macro NOTRUNNINGMACRO un 
Function ${un}EnsureNotRunning 
    ${DisableX64FSRedirection} 
    SetOutPath "$INSTDIR" 
    File ".\killProcess.ps1" 
    nsExec::ExecToStack 'Powershell.exe -inputformat none -noprofile ".\killProcess.ps1"' 

    ${EnableX64FSRedirection} 

    Sleep 500 
    performCheck: 
    System::Call 'kernel32::OpenMutex(i 0x100000, b 0, t "Global\{${BUILD_TARGET} }") i .R0' 
    IntCmp $R0 0 backupCheck isRunning isRunning 
    backupCheck: 
    System::Call 'kernel32::OpenMutex(i 0x100000, b 0, t "Global\{0}") i .R0' 
    IntCmp $R0 0 notRunning isRunning isRunning 
    isRunning: 
    System::Call 'kernel32::CloseHandle(i $R0)' 
    MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "${PRODUCT_NAME} is running. Please close it first" /SD IDCANCEL IDOK performCheck 
    Abort 
    notRunning: 
FunctionEnd 
!macroend 

!insertmacro NOTRUNNINGMACRO "" 
!insertmacro NOTRUNNINGMACRO "un." 

Function un.onUninstSuccess 
    HideWindow 
    IfSilent finished 
    MessageBox MB_ICONINFORMATION|MB_OK "${PRODUCT_NAME} was successfully removed from your computer." 
    finished: 
FunctionEnd 

Function un.onInit 
    !insertmacro MULTIUSER_UNINIT 

    ${If} ${RunningX64} 
    ; disable registry redirection (enable access to 64-bit portion of registry) 
    SetRegView 64 
    ; change install dir 
    StrCpy $INSTDIR "$PROGRAMFILES64\${PRODUCT_NAME}" 
    ${EndIf} 
FunctionEnd 

Var keepUserSettingsCheckbox 
Var keepUserSettingsBool 

Function un.ModifyUnWelcome 
    ${NSD_CreateCheckbox} 120u -18u 50% 12u "Remove user settings" 
    Pop $keepUserSettingsCheckbox 
    SetCtlColors $keepUserSettingsCheckbox "" ${MUI_BGCOLOR} 
    ${NSD_Check} $keepUserSettingsCheckbox ; Check it by default 
FunctionEnd 

Function un.LeaveUnWelcome 
    ${NSD_GetState} $keepUserSettingsCheckbox $0 
    ${If} $0 <> 0 
    StrCpy $keepUserSettingsBool "True" 
    ${Else} 
    StrCpy $keepUserSettingsBool "False" 
${EndIf} 
FunctionEnd 

Function un.GetMyDocs 
    ReadRegStr $0 HKCU \ 
      "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" \ 
      Personal 
FunctionEnd 

Section Uninstall 
    Call un.EnsureNotRunning 

    RMDir /r "$INSTDIR" 
    RMDir /r "$INSTDIR\crashDumps" 
    Delete "$SMPROGRAMS\${PRODUCT_NAME}\*.*" 
    RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}" 
    RMDir /r "$PROGRAMFILES64\${PRODUCT_NAME}" 

    StrCmp $keepUserSettingsBool "True" 0 +11 
    Delete "$LOCALAPPDATA\${PRODUCT_NAME}\*.*" 
    RMDir /r "$LOCALAPPDATA\${PRODUCT_NAME}" 

    Call un.GetMyDocs 
    RMDir /r "$0\${PRODUCT_NAME}" 

    Delete "$DESKTOP\${PRODUCT_NAME}.lnk" 

    DeleteRegKey HKLM "${PRODUCT_UNINST_KEY}" 
    DeleteRegKey HKLM "${PRODUCT_INST_KEY}" 
    DeleteRegValue HKLM "${RUN_REG_KEY}" "${PRODUCT_NAME}" 

    SetAutoClose true 
SectionEnd 
+0

如何创建一个最小,完整和可验证的示例:https://stackoverflow.com/help/mcve – idleberg

回答

0

只需快速浏览一下您的文档即可。也许尝试使用这是适用的。不要在此引用我;我累了,应该睡一会儿..哈哈。祝你好运。

WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "UninstallString" `"$INSTDIR\uninstall.exe"` 
WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "QuietUninstallString" `"$INSTDIR\uninstall.exe" /S` 
相关问题