代码之家  ›  专栏  ›  技术社区  ›  Pat

检查返回代码(或其他内容)以确保MSI已正确安装

  •  2
  • Pat  · 技术社区  · 14 年前

    ExecWait "msiexec /passive /liare+ ${SETUP_LOG_FILE} -i $TEMP\MyMsi.msi" . 当MSI与已安装的应用程序版本相同时,安装将失败(此产品的另一个版本已安装),但NSIS将继续运行,好像没有任何问题。(但是日志文件揭示了问题。)

    如何检查MSI安装是否失败?如果它确实失败了,那么停止NSIS安装的正确方法是什么?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Wim Coenen    14 年前

    你可以检查 error code returned by msiexec . 例如,“已安装此产品的另一个版本”返回1638。

    我不是NSIS用户,但从NSIS文档可以看出,我认为您可以 capture the exit code $0 这样地:

    ExecWait "msiexec -i $TEMP\MyMsi.msi" $0
    
        2
  •  2
  •   Pat    14 年前

    离开@Wim的答案,这是我的解决方案。(我需要安装的应用程序的名称是“Evergreen Programmer”,还有一些代码可以检查CPU是32位还是64位) Abort 使图形用户界面看起来,但是(用户必须单击取消):

    screenshot showing the result of using Abort

    !include "x64.nsh"
    
    Function CheckReturnCode
      DetailPrint "MSI return code was $0"  
      ${If} $0 != 0 
        Abort "There was a problem installing the application."
      ${EndIf}
    FunctionEnd
    
    Section "FrameworkAndApp" SecFrameworkApp
    
      SetOutPath "$TEMP"
      File /oname=EvergreenProgrammerSetup.msi "${SETUP_FILE}"
      File /oname=EvergreenProgrammerSetup64.msi "${SETUP_FILE_64}"
    
    InstallEvergreenProgrammer:
      Push "Starting Evergreen Programmer Install Version ${MAJOR_VERSION}.${MINOR_VERSION}.${REVISION}"
      Call DebugLog
      DetailPrint "Starting Evergreen Programmer Install Version ${MAJOR_VERSION}.${MINOR_VERSION}.${REVISION}"
      IfSilent InstallAppWithNoProgressBar
    ${If} ${RunningX64}
      DetailPrint "64-bit detected"
      ExecWait "msiexec /passive /liare+ ${SETUP_LOG_FILE} -i $TEMP\EvergreenProgrammerSetup64.msi" $0
    ${Else}
      ExecWait "msiexec /passive /liare+ ${SETUP_LOG_FILE} -i $TEMP\EvergreenProgrammerSetup.msi" $0
    ${EndIf}
      Call CheckReturnCode
      SetRebootFlag true
      Goto EndInstall
    
    InstallAppWithNoProgressBar:
    ${If} ${RunningX64}
      DetailPrint "64-bit detected"
      ExecWait "msiexec /quiet /liare+ ${SETUP_LOG_FILE} -i $TEMP\EvergreenProgrammerSetup64.msi" $0
    ${Else}
      ExecWait "msiexec /quiet /liare+ ${SETUP_LOG_FILE} -i $TEMP\EvergreenProgrammerSetup.msi" $0
    ${EndIf}
      Call CheckReturnCode
      SetRebootFlag true
      Goto EndInstall
    
    EndInstall:
      IfRebootFlag PromptForReboot
      Return
    PromptForReboot:
      IfSilent SkipReboot
      MessageBox MB_OK "The application will not function correctly without a reboot or log off."
    
    SkipReboot:
    
    SectionEnd
    
        3
  •  1
  •   Christopher Painter    14 年前

    List of error codes and error messages for Windows Installer processes

    在这种情况下,msiexec应该返回1638代码。