在安装过程中,我运行了一个bat文件。如果bat文件返回错误,我需要中止/终止安装。我想为它做一个MsgBox
告诉用户发生了什么事情,然后为了中止,看起来像用户按下了取消按钮。Inno Setup:如何在安装过程中中止/终止安装?
是否可以终止/终止安装?
代码示例将非常感谢。
[Run]
Filename: {tmp}\test.bat; WorkingDir: {tmp}; Flags: waituntilterminated runhidden
在安装过程中,我运行了一个bat文件。如果bat文件返回错误,我需要中止/终止安装。我想为它做一个MsgBox
告诉用户发生了什么事情,然后为了中止,看起来像用户按下了取消按钮。Inno Setup:如何在安装过程中中止/终止安装?
是否可以终止/终止安装?
代码示例将非常感谢。
[Run]
Filename: {tmp}\test.bat; WorkingDir: {tmp}; Flags: waituntilterminated runhidden
问题是[Run]
在安装过程成功完成后发生。 所以你不能取消在这一点上,你只能卸载。 另外[Run]
不允许您获取退出代码。
所以你有几个选择。
使用事件:procedure CurStepChanged(CurStep: TSetupStep);
而且使用Exec
或ExecAsOriginalUser
这些都呼叫的{tmp}\test.bat
返回的ResultCode。然后您可以提示用户卸载。
但是我认为执行取消操作会更容易。
为此,请在项目中的最后一个文件上创建一个AfterInstall
事件。 并从此事件中执行程序,因为您可以从此事件中取消。
下面是一些示例代码,显示了它可以如何完成。
[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"; AfterInstall: MyAfterInstall
[Code]
procedure MyAfterInstall();
var
ResCode : Integer;
begin
if Exec(ExpandConstant('{tmp}') + '\test.bat',
'', SW_HIDE, ewWaitUntilTerminated, ResCode) then
begin
{ Program Ran successfully ResCode now contains exit code results }
{ if Exit was 10 then Cancel Installation. }
if ResCode = 10 then
begin
WizardForm.Close;
end;
end
else
begin
{ Problem running Program }
MsgBox('Error', SysErrorMessage(ResCode), mbError, MB_OK);
end;
end;
谢谢。这正是我正在寻找的。 – PM2 2011-06-14 18:56:00
“WizardForm.Close”显示一个“是/否”对话框,询问用户他是否要取消,我还有其他强制执行取消的代码吗? – 2013-10-01 11:05:35
谢谢罗伯特。任何时候当脚本检测到无法继续安装时,都会发生常见问题。 但是,您的解决方案存在问题。 WizardForm.Close调用取消对话框,仅当用户回答“是”时才会停止安装。要明确退出,我们应该调用CancelButtonClick。
[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"; AfterInstall: MyAfterInstall
[Code]
var CancelWithoutPrompt: boolean;
function InitializeSetup(): Boolean;
begin
CancelWithoutPrompt := false;
result := true;
end;
procedure MyAfterInstall();
begin
(Do something)
if BadResult then begin
MsgBox('Should cancel because...',mbError,MB_OK)
CancelWithoutPrompt := true;
WizardForm.Close;
end;
end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID=wpInstalling then
Confirm := not CancelWithoutPrompt;
end;
我一直在寻找,所以感谢您的评论! – BenDev 2017-01-06 08:33:59
我用从这里解答一些代码组成complete solution在与错误适当的通知和回滚[运行]部分安全运行的命令。
只是为了圆了其他可能性:
如果你能收集来自用户的任何信息,然后做检查是在InitializeSetup
功能的最佳场所之前检查先决条件。这允许您显示MsgBox
,然后用Result := False
退出以中止安装。
如果您需要先从用户那里收集一些信息(例如安装目录),但仍然可以检查条件而无需安装任何文件(除了可能通过ExtractTemporaryFile
之外的几个文件),那么最好的地方是在PrepareToInstall
功能。这允许您显示错误消息(通过返回它),此时用户可以返回并更正某些内容或自行退出安装。
如果您正在查看的条件与特定页面(如目标目录)上的用户选择有关,并且您可以快速执行检查并且根本不更改用户系统,那么这是最好的在NextButtonClick
处理;您可以显示带有错误的MsgBox
,然后返回False
以防止转到下一页。
如果您必须等到安装其他所有东西后,退出安装还为时过晚,但如果您仍然想这样做,那么Robert的答案就足够了。
另请参阅[如何在运行命令失败时强制Inno Setup安装程序失败?](http://stackoverflow.com/q/1122588/850848)和[使用Process Exit代码显示特定文件的错误消息\ [Run \]](http://stackoverflow.com/q/9621099/850848) – 2017-05-11 13:12:45
另请参阅[退出Inno安装安装从\ [code \]](https://stackoverflow.com/q/4438506/ 850848#39788977)。 – 2017-07-12 12:15:32