Как передать параметры командной строки со значением в Inno Setup Compiler, чтобы я мог использовать их в своем коде? - PullRequest
1 голос
/ 27 марта 2020

У меня есть два возможных варианта сборки. Поскольку я не хочу, чтобы мои клиенты запускали установщик с некоторыми параметрами, лучше передать их компилятору и выполнить всю работу в моем коде.

Допустим, у меня есть переменная UNION, которая может принимать два значения: 0 и 1. Я должен проанализировать значение этой переменной в моем коде и в зависимости от результата включить некоторые файлы или нет. Я знаю, как передать параметры в сам установщик, но как я могу передать их компилятору?

Вот некоторый код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  Code: Integer;
begin
  if CurStep = ssDone then
    begin
      if not IsUnion then
        begin
          DeleteFile(ExpandConstant('{app}')+'\Locale\C4Union.UKR');
          DeleteFile(ExpandConstant('{app}')+'\Locale\C4Union.ENU');  
        end;
    end;
end;

IsUnion - это функция, которая должна анализировать параметр берется из командной строки и затем выполняет свою работу в зависимости от результата.

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Компилятор (или технически препроцессор ) имеет /D ключ командной строки , который можно использовать для установки переменной препроцессора.

Например, это ...

ISCC.exe Example1.iss /DBinaryName=MyProg.exe

... имеет тот же эффект, как если бы вы использовали директиву #define в самом скрипте, например:

#define BinaryName "MyProg.exe"

Таким образом, вы можете использовать его таким же образом в сценарии:

[Files]
Source: "{#BinaryName}"; DestDir: "{app}"

Вы можете использовать переменную даже в условиях , например:

ISCC.exe Example1.iss /DMode=Install
#if Mode == "Install"
[Files]
Source: "MyProg.exe"; DestDir: "{app}"
#elif Mode == "Delete"
[InstallDelete]
Type: files; Name: "{app}\MyProg.exe"
#else
#error Unknonn mode
#endif

Хотя для того же эффекта вы можете использовать только переменную существования , например:

ISCC.exe Example1.iss /DInstall /DDelete
#ifdef Install
[Files]
Source: "MyProg.exe"; DestDir: "{app}"
#endif

#ifdef Delete
[InstallDelete]
Type: files; Name: "{app}\MyProg.exe"
#endif

Это также рассматривается в следующих вопросах:


Вы можете использовать директивы препроцессора в любом месте, даже в разделе [Code].

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssDone then
  begin
    #ifdef Delete
    DeleteFile(ExpandConstant('{app}')+'\Locale\C4Union.UKR');
    DeleteFile(ExpandConstant('{app}')+'\Locale\C4Union.ENU');  
    #endif
  end;
end;

или даже:

#ifdef Delete
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssDone then
  begin
    DeleteFile(ExpandConstant('{app}')+'\Locale\C4Union.UKR');
    DeleteFile(ExpandConstant('{app}')+'\Locale\C4Union.ENU');  
  end;
end;
#endif

Препро cesor не волнует, он начинает как первый шаг и рассматривает файл .iss как простой текстовый файл. Очень похоже на препроцессор C / C ++ . Это не заботится (много) о разделах или структуре кода. Вы можете даже к таким вещам, как:

DeleteFile(
  ExpandConstant(
    #ifdef DeleteFromUserData
    '{userappdata}\MyProg'
    #else
    '{app}'
    #endif
    )+'\Locale\C4Union.UKR');

Добавьте SaveToFile в конец скрипта , чтобы увидеть сгенерированный код.

0 голосов
/ 29 марта 2020

Если вы ищете более удобное решение, посмотрите это расширение для Visual Studio: https://marketplace.visualstudio.com/items?itemName=unSignedsro.VisualInstaller

Вы можете легко установить несколько символов / конфигураций в Свойствах проекта Project Properties и создайте ваши установщики с различными конфигурациями / выходами и т. Д. c.

(не стесняйтесь обращаться ко мне, если у вас есть какие-либо вопросы, я являюсь автором этого расширения).

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