设置编译器标志时,在 Inno Setup 中删除(或不创建)"开始"菜单快捷方式



我有一个 Ant 脚本来编译一个 Java 程序(我想分发的程序),创建几个不同的可执行文件和设置文件(以运行不同的配置),然后启动一个 Inno 安装程序脚本将它们全部放入安装程序中。 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. 删除
  3. 安装结束时删除额外的快捷方式,当我删除文件

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

您的fullJRE"常量">实际上是一个预处理器变量。

您可以在任何预处理器指令中使用它来预处理 Inno 安装程序脚本,使其看起来像您需要的方式。

在这种情况下,您可以使用#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,不如/DfullJRE并使用#ifdef#ifndef指令。

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

相关内容

  • 没有找到相关文章

最新更新