设置编译器标志时,Inno Setup中的删除(或不创建)开始菜单快捷方式 [英] Delete (or do not create) Start menu shortcuts in Inno Setup when compiler flag is set
问题描述
我有一个Ant脚本来编译Java程序(我想要分发的那个),创建几个不同的可执行文件和设置文件(以运行不同的配置),然后启动一个Inno安装脚本将它们放到一个安装程序中。Ant脚本定义了许多属性(主要是路径名和文件名),这些属性将作为常量传递给Inno设置脚本。
我有一个用户需要特殊的可执行文件。无需维护两个不同的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
常量,我需要同时保留文件和快捷方式,或者同时删除它们。
有没有办法让我可以:
- 向
Icons
部分添加‘if’语句以防止创建某些图标 - 当我删除文件时,在安装结束时删除多余的快捷方式
任何帮助都将不胜感激。非常感谢!
推荐答案
您的fullJRE
"常量"实际上是preprocessor variable。
您可以在任何预处理器指令中使用它来预处理Inno安装脚本,使其看起来符合您的需要。
在这种情况下,您可以使用#if
directive:
[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安装脚本的最末尾添加SaveToFile
调用也请参阅预处理器生成的内容:
#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
参见Inno Setup: How do I see the output (translation) of the Inno Setup Preprocessor?
顺便说一下,在这种情况下,约定是定义一个"标志",而不是定义一个有值的变量。
因此,请执行/DfullJRE
并使用#ifdef
and #ifndef
directives,而不是/DfullJRE=1
。
[Icons]
#ifdef fullJRE
Name: "{group}My Program"
#endif
这篇关于设置编译器标志时,Inno Setup中的删除(或不创建)开始菜单快捷方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!