You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从NSIS转Inno Setup:如何集成7z解压进度到安装进度?

在Inno Setup中集成7z解压进度与当前文件显示

核心思路

Inno Setup没有NSIS ExecDos那样的直接回调机制,但可以通过内置的TOutputParser捕获7z(带-bb参数)的命令行输出,逐行解析出解压进度百分比和当前文件名,同步更新安装界面的进度条与状态文本,实现和NSIS脚本一致的效果。

实现步骤与代码

1. 打包7za.exe到临时目录

在脚本的[Files]段添加配置,将7za.exe复制到安装临时目录:

[Files]
Source: "7za.exe"; Flags: dontcopy nocompression; DestDir: "{tmp}"

2. 编写进度解析与界面更新逻辑

在[Code]段实现捕获输出、解析内容、同步界面的完整代码:

[Code]
procedure Update7zProgress(const OutputLine: string);
var
  ProgressPos: Integer;
  ProgressStr: string;
  ProgressPercent: Integer;
  FilePos: Integer;
  CurrentFile: string;
begin
  // 解析进度百分比(匹配类似"  30%"的输出行)
  ProgressPos := Pos('%', OutputLine);
  if ProgressPos > 0 then
  begin
    ProgressStr := Trim(Copy(OutputLine, ProgressPos - 3, 3));
    if TryStrToInt(ProgressStr, ProgressPercent) then
    begin
      WizardForm.ProgressBar.Position := ProgressPercent;
    end;
  end;

  // 解析当前解压文件(匹配类似"Extracting  filename.ext"的输出行)
  FilePos := Pos('Extracting  ', OutputLine);
  if FilePos > 0 then
  begin
    CurrentFile := Trim(Copy(OutputLine, FilePos + Length('Extracting  '), MaxInt));
    WizardForm.StatusLabel.Caption := '正在解压: ' + CurrentFile;
  end;
end;

procedure ExtractWith7z;
var
  SevenZipPath: string;
  ArchivePath: string;
  TargetDir: string;
  OutputParser: TOutputParser;
begin
  // 拼接路径(根据实际场景调整)
  SevenZipPath := ExpandConstant('{tmp}\7za.exe');
  ArchivePath := ExpandConstant('{src}\Package\achivefile.pak');
  TargetDir := ExpandConstant('{app}\installDir');

  // 确保目标目录存在
  ForceDirectories(TargetDir);

  // 初始化输出解析器,执行7z解压命令
  OutputParser := TOutputParser.Create(
    Format('"%s" x "%s" -o"%s" -r -aoa -bb', [SevenZipPath, ArchivePath, TargetDir]),
    eoStdOutput, True);
  try
    // 逐行读取输出并更新界面
    while OutputParser.OutputAvailable do
    begin
      Update7zProgress(OutputParser.ReadLine);
      WizardForm.Update; // 强制界面刷新,避免假死
    end;
  finally
    OutputParser.Free;
    // 解压完成后恢复默认状态
    WizardForm.StatusLabel.Caption := SetupMessage(msgStatusFinished);
    WizardForm.ProgressBar.Position := 100;
  end;
end;

// 在安装阶段触发解压操作
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
  begin
    ExtractWith7z;
  end;
end;

3. 关键细节说明

  • TOutputParser:Inno Setup内置工具类,用于捕获外部程序的标准输出,是实现进度同步的核心载体。
  • -bb参数:7z的该参数会输出详细解压日志,包含进度百分比和当前文件名,是解析的基础。
  • 界面刷新:每次解析后调用WizardForm.Update,确保界面及时响应状态变化,避免安装程序假死。

内容的提问来源于stack exchange,提问作者Yunus Yurtturk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:58:13