如果不是程序文件,下面的程序无法删除应用程序文件,我的意思是如果用户安装在其他位置。卸载后,将删除注册表值,但不删除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
答案 0 :(得分:0)
在这里快速浏览一下您的文档。也许尝试使用这个适用..不要引用我这个;我累了,应该睡个好觉..哈哈。祝你好运。
WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "UninstallString" `"$INSTDIR\uninstall.exe"`
WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "QuietUninstallString" `"$INSTDIR\uninstall.exe" /S`