Удалять (или не создавать) ярлыки меню Пуск в Inno Setup, когда установлен флаг компилятора

У меня есть сценарий Ant для компиляции программы Java (которую я хочу распространить), создания нескольких различных исполняемых файлов и файлов настроек (для запуска различных конфигураций), а затем запуска сценария Inno Setup, чтобы собрать все это вместе в установщик. Сценарий Ant имеет множество определенных свойств (в основном имена путей и имен файлов), которые передаются сценарию Inno Setup как константы.

У меня есть один пользователь, которому нужен специальный исполняемый файл. Вместо того, чтобы поддерживать два разных сценария Ant, было легко сделать так, чтобы сценарий Ant всегда создавал исполняемый файл. Но я также установил для поля свойства (fullJRE) значение 0 или 1 в зависимости от того, нужен исполняемый файл или нет. Свойство передается в Inno Setup как константа, а затем используется в разделе [code] для сохранения / удаления файла в конце. Функция для этого вызывается из процедуры CurStepChanged с использованием CurStep=ssPostInstall:

procedure CurStepChanged(CurStep: TSetupStep);
begin
   if CurStep=ssPostInstall then
      begin
         updateINI();
      end
end;

function updateINI(): boolean;
begin
   if ({#fullJRE} = 0) then
      begin
         DeleteFile(ExpandConstant('{app}\{#launcherName}.exe'));
      end;
end;

Но ярлык для исполняемого файла создается в разделе «Значки» сценария, потому что при запуске [icons] файл все еще существует. Исходя из константы fullJRE, мне нужно либо сохранить и файл, и ярлык, либо удалить их оба.

Есть ли способ:

  1. добавить оператор if в раздел Icons, чтобы предотвратить создание определенных значков
  2. Удалите лишние ярлыки в конце установки, когда я удаляю файлы

Любая помощь будет оценена. Большое спасибо!


person Michael    schedule 03.05.2019    source источник
comment
И то, и другое возможно. Но чтобы дать вам ответ, вы должны подробнее рассказать нам об условии, при котором вы собираетесь решать, что делать. Это что на основе Tasks? Или что-то другое?   -  person Martin Prikryl    schedule 03.05.2019
comment
Почему бы просто не создать только те значки, которые вам нужны, вместо того, чтобы впоследствии удалять ненужные значки?   -  person Bill_Stewart    schedule 03.05.2019
comment
Я обновил вопрос, добавив еще несколько деталей, чтобы было понятнее, что я делаю.   -  person Michael    schedule 04.05.2019
comment
Вы действительно ничего не объяснили. flag может означать дюжину разных вещей. Может помочь, если вы покажете нам свой CurStepChanged код, чтобы мы могли увидеть, как вы относитесь к этому флагу, чем бы он ни был.   -  person Martin Prikryl    schedule 04.05.2019
comment
флаг - это константа, передаваемая сценарию Inno Setup из сценария Ant. Я добавил более подробную информацию, чтобы объяснить, как это делается.   -  person Michael    schedule 06.05.2019


Ответы (1)


Ваша fullJRE "константа" на самом деле является переменной препроцессора.

Вы можете использовать его в любой директиве препроцессора для предварительной обработки вашего сценария Inno Setup, чтобы он выглядел так, как вам нужно.

В этом случае вы можете использовать #if директиву:

[Icons]
#if fullJRE == "1"
Name: "{group}\My Program"
#endif

И вы должны сделать то же самое даже для своего updateINI кода. Ваш текущий подход генерирует ненужный код, например:

function updateINI(): boolean;
begin
   if (1 = 0) then
      begin
         DeleteFile(ExpandConstant('{app}\{#launcherName}.exe'));
      end;
end;

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

#if fullJRE == "0"

procedure CurStepChanged(CurStep: TSetupStep);
begin
   if CurStep=ssPostInstall then
      begin
         updateINI();
      end
end;

function updateINI(): boolean;
begin
   DeleteFile(ExpandConstant('{app}\{#launcherName}.exe'));
end;

#endif

Добавьте вызов SaveToFile в самом конце ваш сценарий Inno Setup тоже видит, что генерирует препроцессор:

#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")

См. Inno Setup: как мне увидеть вывод (перевод) препроцессора Inno Setup?


Кстати, в подобных сценариях принято определять «флаг», а не переменную со значением.

Поэтому вместо /DfullJRE=1 сделайте /DfullJRE и используйте #ifdef и #ifndef директивы.

[Icons]
#ifdef fullJRE
Name: "{group}\My Program"
#endif
person Martin Prikryl    schedule 06.05.2019
comment
Идеально! Большое спасибо, Мартин, я ценю всю помощь. И ссылка на онлайн-справку препроцессора - с тех пор, как я последний раз работал над этим, прошло больше года, и я не мог вспомнить детали препроцессора или найти онлайн-справку (все, что я нашел, это файлы справки для Inno Setup). - person Michael; 07.05.2019