回复较晚,但这是我为其他寻找答案的人制作的一些示例代码。
在[Setup] 部分上方,您需要定义一个名为 AppName 的常量供以后使用,您也可以使用它来设置您的 Setup AppName 变量。
#define AppName "Test Installer"
[Setup]
AppName={#AppName}
现在您需要在[code] 部分添加以下内容。
[Code]
var
InstallWithProgressPage : TOutputProgressWizardPage;
//Create custom progress bar for install progress
procedure InitializeWizard;
var
UpdatedPageString: AnsiString;
OriginalPageString: String;
begin
//The string msgWizardPreparing has the macro '[name]' inside that we have to replace.
OriginalPageString := SetupMessage(msgPreparingDesc);
StringChange(OriginalPageString, '[name]', '{#AppName}');
UpdatedPageString := OriginalPageString;
InstallWithProgressPage := CreateOutputProgressPage(SetupMessage(msgWizardPreparing), UpdatedPageString);
end;
//Enable or Disable the install progress page (also set initial progress/text)
procedure DisplayInstallProgress(showPage:Boolean; progressText:String);
begin
if(showPage = True) then
begin
InstallWithProgressPage.Show;
InstallWithProgressPage.SetText(progressText, '');
InstallWithProgressPage.SetProgress(0,100);
end
else
begin
InstallWithProgressPage.Hide;
end
end;
//Update the install progress page
procedure UpdateInstallProgress(progressText:String; progressPercent:Integer);
begin
InstallWithProgressPage.SetProgress(progressPercent,100);
InstallWithProgressPage.SetText(progressText, '');
end;
现在您可以使用 BeforeInstall 和 AfterInstall 参数调用 [Run] 部分中的 DisplayInstallProgress 和 UpdateInstallProgress 过程,如下所示。
[Run]
FileName: "Powershell.exe"; Parameters: "-File {app}\Part1.ps1"; BeforeInstall: DisplayInstallProgress(True, 'Installing part 1.');
FileName: "Powershell.exe"; Parameters: "-File {app}\Part2.ps1"; BeforeInstall: UpdateInstallProgress('Installing part 2.', 30);
FileName: "Powershell.exe"; Parameters: "-File {app}\Part3.ps1"; BeforeInstall: UpdateInstallProgress('Installing part 3.', 60);
FileName: "Powershell.exe"; Parameters: "-File {app}\Part3.ps1"; BeforeInstall: UpdateInstallProgress('Installing part 4.',90); AfterInstall: DisplayInstallProgress(False, '');
我曾将此问题/答案用作创建进度页面的模板:How to show progress during “PrepareToInstall”?
最后一点,这个实现违背了jrsoftware's advice:
始终将 Hide 调用放在 try..finally 语言结构的 finally 部分中,如 CodeDlg.iss 中所示。不调用 Hide 将导致向导永久卡在进度页面上。
但是,如果不这样做,我无法想出在 [run] 部分中跨项目实施进度的方法。