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.