我有一个 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
常量,我要么需要同时保留文件和快捷方式,要么将它们同时删除。
有没有办法我可以:
- 将"if"语句添加到
Icons
部分以防止创建某些图标
删除 - 安装结束时删除额外的快捷方式,当我删除文件
任何帮助将不胜感激。 非常感谢!
您的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