我写了一个安装脚本来安装第三方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;
答案 0 :(得分:1)
[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"
)。