Inno setup 当Run命令失败时,如何强制Inno安装程序失败?

Inno setup 当Run命令失败时,如何强制Inno安装程序失败?,inno-setup,Inno Setup,我在Inno安装脚本的[Run]部分中有一些命令。现在,如果其中任何一个返回故障代码(非零返回值),安装程序将继续进行,而不会向用户发出任何警告。所需的行为是设置失败并回滚 如何启用此功能?我找不到任何Run项的标志来强制执行此行为。我遗漏了什么吗?就我而言,您必须使用[code]部分,使用Exec函数运行文件,返回时检查ResultCode,然后运行卸载脚本。我是这样做的: 将错误消息(中止确认消息或只是通知消息)写入临时文件{tmp}\install.error在安装之前使用Inno安装程序

我在Inno安装脚本的
[Run]
部分中有一些命令。现在,如果其中任何一个返回故障代码(非零返回值),安装程序将继续进行,而不会向用户发出任何警告。所需的行为是设置失败并回滚


如何启用此功能?我找不到任何
Run
项的标志来强制执行此行为。我遗漏了什么吗?

就我而言,您必须使用
[code]
部分,使用
Exec
函数运行文件,返回时检查
ResultCode
,然后运行卸载脚本。

我是这样做的:

  • 将错误消息(中止确认消息或只是通知消息)写入临时文件
    {tmp}\install.error
    在安装之前使用Inno安装程序的
    参数和
    SaveStringToUTF8File
    过程。您可以使用Inno安装程序的常量,例如
    {cm:yourcustomessage}

  • 使用Windows命令shell
    cmd.exe/s/c
    运行所需程序。还可以将有条件执行
    del
    命令与
    &&
    -。所以,如果命令成功,错误消息文件将被删除(退出代码0)。请注意
    cmd.exe/s/c
    中的特殊引号处理。使用下面的代码作为示例

  • 根据错误严重程度,使用Inno安装程序的
    AfterInstall
    参数和
    confirminInstallAbortOnError
    NotifyInstallAbortOnError
    过程,检查是否存在错误消息文件
    {tmp}\install.error
    。他们将在适当的通知或确认(以及可选的日志文件显示)下中止安装,并使用
    Exec(ExpandConstant({uninstallexe}'),…

  • ShouldAbortInstallation
    全局变量用于保持状态。Inno安装程序的
    ShouldSkipPage(PageID:Integer)
    函数用于隐藏最终页面。
    [运行]中的所有命令
    部分应使用带有
    CheckInstallationIsNotAborted
    功能的
    Check
    参数。它将阻止在某个点出现故障后执行这些参数

  • 请参阅下面的示例。希望这对您有所帮助

    [CustomMessages]
    InstallAbortOnErrorConfirmationMessage=An error has occurred during setup.%nAbort installation?
    InstallAbortOnErrorNotificationMessage=An error has occurred during setup.%nInstallation will be aborted.
    RunProgram1ErrorMsg=Post installation phase 1 failed. Should abort install?
    RunProgram2ErrorMsg=Post installation phase 2 failed. Installation will be aborted. Please, contact tech support.
    RunProgram1StatusMsg=Post installation phase 1 is in progress
    RunProgram2StatusMsg=Post installation phase 2 is in progress
    
    [Run]
    ; Write error text to file. Delete file on succeed. Abort installation if file exists after command execution.
    Filename: "cmd.exe"; Parameters: "/s /c "" ""{app}\program1.exe"" /param1 /param2:""val2"" && del /F /Q ""{tmp}\install.error"" """; \
      WorkingDir:"{app}"; Flags: runhidden; \
      BeforeInstall: SaveStringToUTF8File('{tmp}\install.error', '{cm:RunProgram1ErrorMsg}', False); \
      AfterInstall: ConfirmInstallAbortOnError('{tmp}\install.error', '{app}\logs\setup.log'); \
      StatusMsg: "{cm:RunProgram1StatusMsg}"; \
      Check: CheckInstallationIsNotAborted;
    Filename: "cmd.exe"; Parameters: "/s /c "" ""{app}\program2.exe"" && del /F /Q ""{tmp}\install.error"" """; \
      WorkingDir:"{app}"; Flags: runhidden; \
      BeforeInstall: SaveStringToUTF8File('{tmp}\install.error', '{cm:RunProgram2ErrorMsg}', False); \
      AfterInstall: NotifyInstallAbortOnError('{tmp}\install.error', '{app}\logs\setup.log'); \
      StatusMsg: "{cm:RunProgram2StatusMsg}"; \
      Check: CheckInstallationIsNotAborted;
    
    [代码]
    变量
    ShouldAbortInstallation:布尔值;
    过程SaveStringToUTF8File(常量文件名,内容:字符串;常量附加:布尔值);
    变量
    Text:字符串的数组[1..1];
    开始
    文本[1]:=内容;
    SaveStringsToUTF8File(ExpandConstant(文件名)、文本、追加);
    结束;
    函数LoadAndConcatStringsFromFile(常量文件名:String):String;
    变量
    字符串:TArrayOfString;
    i:整数;
    开始
    LoadStringsFromFile(文件名,字符串);
    结果:='';
    如果高(字符串)>=低(字符串),则
    结果:=字符串[低(字符串)];
    对于i:=低(字符串)+1到高(字符串)do
    如果长度(字符串[i])>0,则
    结果:=Result+#13#10+字符串[i];
    结束;
    过程确认InstallAbortOnError(ErrorMessageFile,LogFileToShow:String);
    变量
    错误代码:整数;
    错误消息:字符串;
    开始
    ErrorMessageFile:=ExpandConstant(ErrorMessageFile);
    LogFileToShow:=ExpandConstant(LogFileToShow);
    日志('ConfirmInstallAbortOnError正在检查文件:'+ErrorMessageFile);
    如果文件存在(ErrorMessageFile),则
    开始
    日志('ConfirmInstallAbortOnError:错误文件存在');
    {向用户显示日志文件}
    如果长度(LogFileToShow)>0,则
    ShellExec(“”,LogFileToShow,“”,SW_SHOW,ewNoWait,ErrorCode);
    ErrorMessage:=LoadAndConcatStringsFromFile(ErrorMessageFile);
    如果长度(ErrorMessage)=0,则
    ErrorMessage:='{cm:InstallAbortOnErrorConfirmationMessage}';
    如果MsgBox(ExpandConstant(ErrorMessage)、mbConfirmation、MB_YESNO)=y,则
    开始
    日志('ConfirmInstallAbortOnError:should abort');
    ShouldAbortInstallation:=真;
    隐藏;
    隐藏;
    Exec(ExpandConstant({uninstallexe}'),'/SILENT','',SW_HIDE,
    EWWAIT未过滤,错误代码);
    主窗体。关闭;
    结束;
    结束;
    日志('ConfirmInstallAbortOnError finish');
    结束;
    过程NotifyInstallAbortOnError(ErrorMessageFile,LogFileToShow:String);
    变量
    错误代码:整数;
    错误消息:字符串;
    开始
    ErrorMessageFile:=ExpandConstant(ErrorMessageFile);
    LogFileToShow:=ExpandConstant(LogFileToShow);
    日志('NotifyInstallAbortOnError正在检查文件:'+ErrorMessageFile);
    如果文件存在(ErrorMessageFile),则
    开始
    日志('NotifyInstallAbortOnError:错误文件存在');
    {向用户显示日志文件}
    如果长度(LogFileToShow)>0,则
    ShellExec(“”,LogFileToShow,“”,SW_SHOW,ewNoWait,ErrorCode);
    ErrorMessage:=LoadAndConcatStringsFromFile(ErrorMessageFile);
    如果长度(ErrorMessage)=0,则
    ErrorMessage:='{cm:InstallAbortOnErrorNotificationMessage}';
    MsgBox(ExpandConstant(ErrorMessage),mbError,MB_OK);
    日志('NotifyInstallAbortOnError:should abort');
    ShouldAbortInstallation:=真;
    隐藏;
    隐藏;
    Exec(ExpandConstant({uninstallexe}'),'/SILENT','',SW_HIDE,
    EWWAIT未过滤,错误代码);
    主窗体。关闭;
    结束;
    日志('NotifyInstallAbortOnError finish');
    结束;
    函数ShouldSkipPage(PageID:Integer):布尔值;
    开始
    结果:=应中止安装;
    结束;
    函数CheckInstallationIsNotAborted():布尔值;
    开始
    结果:=不应中止安装;
    结束;
    
    您可以使用
    运行
    部分中的
    安装后
    标志来触发程序的执行并捕获结果代码

    看我的


    然后根据结果代码,您可以取消安装。

    安装完成后会出现
    [Run]
    部分,因此此时无法回滚,因为它已经完成

    但是,您可以在
    [Files]
    部分中使用
    .exe
    或执行所需的任何内容