设置编译器标志时删除(或不创建)Inno Setup 中的开始菜单快捷方式
Delete (or do not create) Start menu shortcuts in Inno Setup when compiler flag is set
我有一个 Ant 脚本来编译 Java 程序(我想分发的程序),创建一些不同的可执行文件和设置文件(运行 不同的配置),然后启动一个 Inno Setup 脚本,将它们全部放在一个安装程序中。 Ant 脚本定义了许多属性(主要是路径名和文件名),这些属性作为常量传递给 Inno Setup 脚本。
我有一个用户需要一个特殊的可执行文件。与其维护两个不同的 Ant 脚本,不如让 Ant 脚本始终创建可执行文件很容易。但我还将 属性 字段 (fullJRE
) 设置为 0 或 1,具体取决于是否需要可执行文件。 属性 作为常量传递给 Inno Setup,然后在 [code] 部分中用于最后 keep/delete 文件。执行此操作的函数是从 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
"constant"实际上是一个preprocessor variable.
您可以在任何预处理器指令中使用它来预处理您的 Inno Setup 脚本,使其看起来像您需要的那样。
在这种情况下,您可以使用 #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 Setup 脚本的 末尾 添加一个 SaveToFile
调用 也请参阅预处理器生成的内容:
#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
见Inno Setup: How do I see the output (translation) of the Inno Setup Preprocessor?
顺便说一句,在这种情况下,约定是定义一个 "flag",而不是一个有值的变量。
所以不要使用 /DfullJRE=1
,而是使用 /DfullJRE
并使用 #ifdef
and #ifndef
directives。
[Icons]
#ifdef fullJRE
Name: "{group}\My Program"
#endif
我有一个 Ant 脚本来编译 Java 程序(我想分发的程序),创建一些不同的可执行文件和设置文件(运行 不同的配置),然后启动一个 Inno Setup 脚本,将它们全部放在一个安装程序中。 Ant 脚本定义了许多属性(主要是路径名和文件名),这些属性作为常量传递给 Inno Setup 脚本。
我有一个用户需要一个特殊的可执行文件。与其维护两个不同的 Ant 脚本,不如让 Ant 脚本始终创建可执行文件很容易。但我还将 属性 字段 (fullJRE
) 设置为 0 或 1,具体取决于是否需要可执行文件。 属性 作为常量传递给 Inno Setup,然后在 [code] 部分中用于最后 keep/delete 文件。执行此操作的函数是从 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
"constant"实际上是一个preprocessor variable.
您可以在任何预处理器指令中使用它来预处理您的 Inno Setup 脚本,使其看起来像您需要的那样。
在这种情况下,您可以使用 #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 Setup 脚本的 末尾 添加一个 SaveToFile
调用 也请参阅预处理器生成的内容:
#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
见Inno Setup: How do I see the output (translation) of the Inno Setup Preprocessor?
顺便说一句,在这种情况下,约定是定义一个 "flag",而不是一个有值的变量。
所以不要使用 /DfullJRE=1
,而是使用 /DfullJRE
并使用 #ifdef
and #ifndef
directives。
[Icons]
#ifdef fullJRE
Name: "{group}\My Program"
#endif