首页 > 解决方案 > 设置编译器标志时在 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. 当我删除文件时,在安装结束时删除额外的快捷方式

任何帮助,将不胜感激。非常感谢!

标签: iconsinstallationinno-setupstartmenu

解决方案


您的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

在 Inno Setup 脚本的最后添加一个SaveToFile调用,查看预处理器生成的内容:

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

请参阅Inno Setup:如何查看 Inno Setup 预处理器的输出(翻译)?


顺便说一句,在这种情况下,约定是定义一个“标志”,而不是一个带有值的变量。

所以代替/DfullJRE=1, do/DfullJRE和 use#ifdef#ifndefdirectives

[Icons]
#ifdef fullJRE
Name: "{group}\My Program"
#endif

推荐阅读