Я написал скрипт установки для установки стороннего 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]
выше использовать возвращаемое значение этой функции в строке Parameters
внешнего setup.exe, который я запускаю ... Я имею в виду, что-то вроде этого
[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;