Генерация параметров программы, выполняемой из раздела Inno Setup [Run], на основе выбранных задач - PullRequest
1 голос
/ 17 июня 2019

Я написал скрипт установки для установки стороннего 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;

1 Ответ

1 голос
/ 18 июня 2019

Использовать скриптовую константу :

[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") .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...