Удалить (или не создавать) ярлыки меню «Пуск» в Inno Setup, когда установлен флаг компилятора - PullRequest
1 голос
/ 03 мая 2019

У меня есть скрипт 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. удаляет дополнительные ярлыки в конце установки, когда я удаляю файлы

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

1 Ответ

1 голос
/ 06 мая 2019

Ваша 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?


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

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

[Icons]
#ifdef fullJRE
Name: "{group}\My Program"
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...