简体   繁体   中英

NSIS silent uninstall SetErrorLevel

In this little nsis installer, I would like to internally set the errorlevel and catch it externally (when I run the installer/uninstaller in silent mode inside a batch script), but somehow I always get %errorlevel% = 0.

Here is my nsi script

!addincludedir .\include
!include StrRep.nsh
!include ReplaceInFile.nsh


!include LogicLib.nsh


!include FileFunc.nsh
!insertmacro GetParameters
!insertmacro GetOptions


!define MY_APP_NAME "foo"

Outfile "${MY_APP_NAME}.exe"

InstallDir $DESKTOP


Section

  ${GetParameters} $R0 


  ClearErrors
  ${GetOptions} $R0 /PLACEHOLDER= $0

  IfErrors 0 +2
    Call ErrorHandler

  SetOutPath $INSTDIR


  File /r foo_root_folder

  !insertmacro _ReplaceInFile "foo_root_folder\subfolder_a\test.properties" "%%placeholder_string%%" "$0"


  WriteRegStr HKLM "SOFTWARE\${MY_APP_NAME}" "Install_Dir" "$INSTDIR\foo_root_folder"


  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" "Publisher" "Federico"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" "DisplayName" "${MY_APP_NAME}"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" "DisplayVersion" "1.0"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" "UninstallString" '"$INSTDIR\foo_root_folder\uninstall.exe"'
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" "NoModify" 1
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" "NoRepair" 1
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" "EstimatedSize" 1000
  WriteUninstaller "foo_root_folder\uninstall.exe"



SectionEnd

Section "Uninstall"

  ReadRegStr $0 HKLM "SOFTWARE\${MY_APP_NAME}" "Install_Dir"

  ${If} ${Errors}
    Call un.ErrorHandler
  ${Else}
    ${IF} $0 == ""
                Call un.ErrorHandler
          ${ELSE}


          DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}"
          DeleteRegKey HKLM "SOFTWARE\${MY_APP_NAME}"


          RmDir /r /REBOOTOK "$0"
          ${ENDIF}
  ${EndIf}


SectionEnd



Function ErrorHandler
  SetErrorLevel 1 
  Quit

FunctionEnd


Function un.ErrorHandler
  SetErrorLevel 1 
  Quit

FunctionEnd

Is something wrong in it? I think that with those lines (in case of error) I should have %errorlevel% = 1

SetErrorLevel 1 
Quit

For example: after the installation, I deliberately delete the registry key "HKLM\\SOFTWARE\\${MY_APP_NAME}", and THEN run the uninstaller. It does not find the key and quits as expected, BUT the %errorlevel% is still 0

The installer should set the code as expected.

The uninstaller executes a copy of itself in %temp% so that it is able to delete itself in $Instdir . It will set a non-zero exit code if this fails but it will not wait for the other uninstaller instance and report the true exit code.

You can run the uninstaller with the documented _?= switch to skip the copy step but then you have to manually delete the uninstaller .exe.

_?= sets $INSTDIR. It also stops the uninstaller from copying itself to the temporary directory and running from there. It can be used along with ExecWait to wait for the uninstaller to finish. It must be the last parameter used in the command line and must not contain any quotes, even if the path contains spaces.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM