Inno setup 当Run命令失败时,如何强制Inno安装程序失败?
我在Inno安装脚本的Inno setup 当Run命令失败时,如何强制Inno安装程序失败?,inno-setup,Inno Setup,我在Inno安装脚本的[Run]部分中有一些命令。现在,如果其中任何一个返回故障代码(非零返回值),安装程序将继续进行,而不会向用户发出任何警告。所需的行为是设置失败并回滚 如何启用此功能?我找不到任何Run项的标志来强制执行此行为。我遗漏了什么吗?就我而言,您必须使用[code]部分,使用Exec函数运行文件,返回时检查ResultCode,然后运行卸载脚本。我是这样做的: 将错误消息(中止确认消息或只是通知消息)写入临时文件{tmp}\install.error在安装之前使用Inno安装程序
[Run]
部分中有一些命令。现在,如果其中任何一个返回故障代码(非零返回值),安装程序将继续进行,而不会向用户发出任何警告。所需的行为是设置失败并回滚
如何启用此功能?我找不到任何
Run
项的标志来强制执行此行为。我遗漏了什么吗?就我而言,您必须使用[code]
部分,使用Exec
函数运行文件,返回时检查ResultCode
,然后运行卸载脚本。我是这样做的:
{tmp}\install.error
在安装之前使用Inno安装程序的参数和SaveStringToUTF8File
过程。您可以使用Inno安装程序的常量,例如{cm:yourcustomessage}
cmd.exe/s/c
运行所需程序。还可以将有条件执行del
命令与&&
-。所以,如果命令成功,错误消息文件将被删除(退出代码0)。请注意cmd.exe/s/c
中的特殊引号处理。使用下面的代码作为示例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
或执行所需的任何内容