使用 Inno Setup

问题描述

根据我在 Inno Setup 中选择的内容,安装程序应添加一个包含包名后跟 , 的条目到 config.ini

并将少数特定设置所需的正确预制配置文件(存储在安装程序中)提取Config 文件夹中。

有很多程序,比如 Chrome/Firefox,不需要任何参数或额外的配置来安装。

所需的 config.ini 文件语法:

<package1>,<package2 /X /Y /Z>,<package 3> ...

其中 <packageX> 是与安装程序选择菜单中的复选框相关联的字符串值。

Inno Setup 完成后,它应该运行一个批处理文件

加分项:再次..不仅输出config.ini,而且还为特定程序提取必要的预制配置设置到文件C:/NKsetup/Config/

解决方法

将您的每个包作为组件添加到 Components section。然后在 Files section 中,您可以根据所选组件选择安装哪些文件。对于包列表配置文件,您需要使用 WizardIsComponentSelected function 对其进行编码。

[Setup]
DefaultDirName=C:\some\path

[Types]
Name: "custom"; Description: "-"; Flags: iscustom

[Components]
Name: "sqlserver"; Description: "Microsoft SQL server"
Name: "chrome"; Description: "Google Chrome"
Name: "firefox"; Description: "Mozilla Firefox"

[Files]
Source: "install.bat"; DestDir: "{app}"
Source: "common-config.ini"; DestDir: "{app}"
Source: "sqlserver-config.ini"; DestDir: "{app}"; Components: sqlserver
Source: "browsers-config.ini"; DestDir: "{app}"; Components: chrome firefox

[Run]
Filename: "{app}\install.bat"; StatusMsg: "Installing..."
[Code]

procedure CurStepChanged(CurStep: TSetupStep);
var
  ConfigPath: string;
  Packages: string;
begin
  if CurStep = ssPostInstall then
  begin
    if WizardIsComponentSelected('sqlserver') then
    begin
      Packages := Packages + ',sql-server-express /X /Y /Z';
    end;
    if WizardIsComponentSelected('chrome') then
    begin
      Packages := Packages + ',chrome';
    end;
    if WizardIsComponentSelected('firefox') then
    begin
      Packages := Packages + ',firefox';
    end;

    // Remove the leading comma
    if Packages <> '' then
    begin
      Delete(Packages,1,1);
    end;

    ConfigPath := ExpandConstant('{app}\config.ini');
    // This is not Unicode-safe
    if not SaveStringToFile(ConfigPath,Packages,False) then
    begin
      Log(Format('Error saving packages to %s',[ConfigPath]));
    end
      else
    begin
      Log(Format('Packages saved to %s: %s',[ConfigPath,Packages]));
    end;
  end;
end;

enter image description here