如果没有安装在程序文件中,NSIS卸载程序不会提供app文件

时间:2017-05-25 09:32:29

标签: nsis uninstaller

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

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

1 个答案:

答案 0 :(得分:0)

在这里快速浏览一下您的文档。也许尝试使用这个适用..不要引用我这个;我累了,应该睡个好觉..哈哈。祝你好运。

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