在安装目录树之前执行一次脚本

Execute script once before installing a directory tree

我正在尝试编写一个 Inno Setup 安装程序来安装,然后 运行 其他安装程序。我遇到的问题是在尝试安装 Cygwin 时。我已经下载了 Cygwin 和我需要的所有包,所以我可以执行本地安装。然后我想在 Cygwin 安装中添加额外的文件和目录。

我的第一次尝试是这样的:

[Files]
Source: "{#Cygwin}\Cygwin\*"; DestDir: {tmp}\cygwin; Flags: recursesubdirs;
Source: "{#Cygwin}\additional\*"; DestDir: {tmp}\cygwin\additional; Flags: recursesubdirs

[Run]
Filename: "{tmp}\cygwin\setup-x86_64.exe"; Parameters: "-q -L"; WorkingDir: "{tmp}";

但这意味着我必须有一个脚本来添加额外的文件,因为在通过 [Run] 部分中的命令实际安装 Cygwin 之前,没有地方可以放置它们。

我尝试在 [Files] 部分使用 BeforeInstall 脚本到 运行 Cygwin 安装程序,然后再添加其他文件,但因为我必须使用通配符 Source: "{#Cygwin}\additional\*"; 目录树中的每个文件都会调用一次脚本。

Inno Setup 的 [Files] 部分似乎只接受源 files,而不接受源 directory,除非目录有通配符。

有没有一种方法可以让它在不使用通配符的情况下从目录树安装所有内容,或者有没有一种方法可以使 BeforeInstall 脚本 运行 只需一次,无论如何复制了很多文件?

仅在首次调用 BeforeInstall 函数时安装 Cygwin。

var
  CygwinInstalled: Boolean;

procedure MyBeforeInstall;
begin
  if CygwinInstalled then
  begin
    Log('Cygwin installed already');
  end
    else
  begin
    Log('Installing Cygwin');

    { install Cygwin here }

    CygwinInstalled := true;
  end;
end;