根据所选任务生成从“ Inno Setup [运行]”部分执行的程序的参数

时间:2019-06-17 17:39:41

标签: inno-setup

我写了一个安装脚本来安装第三方setup.exe,然后运行该脚本以静默方式安装它。运行此外部setup.exe时,必须通过其命令行参数指定要安装的产品。为此,我有十几个任务,每个任务代表是否要安装的产品。

因为任务太多,所以我想用一种比And / And Not任务检查12 * 12次在下面写这行的方式更简单,更聪明的方式...

[Run]
Filename: {tmp}\Setup.exe; Parameters: /ProductNames=product1,product2,etc...; \
    Flags: shellexec WaitUntilTerminated; StatusMsg: Installing products...; \
    Tasks: product1 and product2 and not product3 etc...

也许这不是实现此目的的最佳方法,但是在[Code]部分中,我声明了一些变量来存储是否要安装的产品名称,并且我希望能够像这样引用这些变量:

[Run]
Filename: {tmp}\Setup.exe; Parameters: /ProductNames={%product1}{%product2}; \
    Flags: shellexec WaitUntilTerminated; StatusMsg: Installing products...;

因此,这会将[Run]部分简化为该行,而不是数十种变体...

我该怎么做?。

如果不可能,那么作为替代,我可以声明一个函数,该函数返回以逗号分隔的字符串,其中包含要安装的产品名称,但是我不知道如何在[Run]中调用它上面的部分在我运行的外部setup.exe的Parameters字符串中使用该函数的返回值...我的意思是,类似这样的

[Run]
Filename: {tmp}\Setup.exe; Parameters: /ProductNames={MyFunction()}; \
    Flags: shellexec WaitUntilTerminated; StatusMsg: Installing products...;

这是我的[Code]部分的缩小示例:

[Code]

var 
  product1: string;
  product2: string;

procedure TaskOnClickCheck(Sender: TObject); 
begin
  { reset values. }
  product1 := ''
  product2 := ''

  if IsTaskSelected('product1') then 
  begin
    product1 := ',product1 Name'
  end;

  if IsTaskSelected('product2') then 
  begin
    product2 := ',product2 Name'
  end;

end;

procedure InitializeWizard();
begin
  WizardForm.TasksList.OnClickCheck := @TaskOnClickCheck;
end;

1 个答案:

答案 0 :(得分:1)

使用scripted constant

[Run]
Filename: {tmp}\Setup.exe; Parameters: /ProductNames={code:GetProducts}; \
    Flags: shellexec waituntilterminated; StatusMsg: Installing products...

[Tasks]
Name: product1; Description: "Product 1"
Name: product2; Description: "Product 2"
Name: product3; Description: "Product 3"
[Code]

function GetProducts(Param: string): string;
var
  ProductList: TStringList;
begin
  ProductList := TStringList.Create;

  if IsTaskSelected('product1') then ProductList.Add('Prod1');
  if IsTaskSelected('product2') then ProductList.Add('Prod2');
  if IsTaskSelected('product3') then ProductList.Add('Prod3');

  Result := ProductList.CommaText;
  ProductList.Free;
  Log('Product list is: ' + Result);
end;
上面的

ProductList.CommaText会产生类似Prod1,Prod2 的输出(尽管如果产品名称中有空格,它将产生"Prod 1","Prod 2"