在这个小小的nsis安装程序中,我想在内部设置errorlevel并在外部捕获它(当我在批处理脚本中以静默模式运行安装程序/卸载程序时),但不知怎的,我总是得到%errorlevel%= 0。 / p>
这是我的nsi脚本
!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
它有什么问题吗?我认为那些行(如果出错)我应该有%errorlevel%= 1
SetErrorLevel 1
Quit
例如:安装后,我故意删除注册表项“HKLM \ SOFTWARE \ $ {MY_APP_NAME}”,然后运行卸载程序。它没有按预期找到键和退出,但%errorlevel%仍为0
答案 0 :(得分:1)
安装程序应按预期设置代码。
卸载程序在%temp%
中执行自身的副本,以便它能够在$Instdir
中删除自己。如果失败但它将等待另一个卸载程序实例并报告真正的退出代码,它将设置一个非零退出代码。
您可以使用documented _?=
开关运行卸载程序以跳过复制步骤,但您必须手动删除卸载程序.exe。
_?=设置$ INSTDIR。它还会阻止卸载程序将自身复制到临时目录并从那里运行。它可以与ExecWait一起使用,等待卸载程序完成。它必须是命令行中使用的最后一个参数,并且不得包含任何引号,即使路径包含空格。