Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file NSIS静默卸载SetErrorLevel_Batch File_Installation_Nsis_Silent Installer - Fatal编程技术网

Batch file NSIS静默卸载SetErrorLevel

Batch file NSIS静默卸载SetErrorLevel,batch-file,installation,nsis,silent-installer,Batch File,Installation,Nsis,Silent Installer,在这个小型nsis安装程序中,我希望在批处理脚本中以静默模式运行安装程序/卸载程序时,在内部设置errorlevel,并在外部捕获它,但不知何故,我总是得到%errorlevel%=0 这是我的nsi脚本 !addincludedir .\include !include StrRep.nsh !include ReplaceInFile.nsh !include LogicLib.nsh !include FileFunc.nsh !insertmacro GetParameters

在这个小型nsis安装程序中,我希望在批处理脚本中以静默模式运行安装程序/卸载程序时,在内部设置errorlevel,并在外部捕获它,但不知何故,我总是得到%errorlevel%=0

这是我的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

安装程序应按预期设置代码

卸载程序在%temp%中执行自身的副本,以便能够在$Instdir中删除自身。如果失败,它将设置非零退出代码,但不会等待其他卸载程序实例并报告真实的退出代码

您可以使用开关运行卸载程序以跳过复制步骤,但随后必须手动删除卸载程序.exe

_?=设置$INSTDIR。它还阻止卸载程序将自身复制到临时目录并从那里运行。它可以与ExecWait一起使用,以等待卸载程序完成。它必须是命令行中使用的最后一个参数,并且不能包含任何引号,即使路径包含空格