icons - 设置编译器标志时在 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
常量,我要么需要保留文件和快捷方式,要么都删除它们。
有没有办法我可以:
- 向该部分添加“if”语句以
Icons
防止创建某些图标 - 当我删除文件时,在安装结束时删除额外的快捷方式
任何帮助,将不胜感激。非常感谢!
解决方案
您的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
和#ifndef
directives。
[Icons]
#ifdef fullJRE
Name: "{group}\My Program"
#endif
推荐阅读
- chisel - 什么机制可以在 chisel3 详细说明中显示组件 ID
- javascript - 如何使用流分析存储传入事件的 UDF 返回值?
- javascript - 如何在尚未满足条件时执行一系列控制
- excel - 即使使用新的空白工作簿,Excel 也会警告“此工作簿包含链接”
- c# - 单选按钮始终选中项目显示 False
- elasticsearch - 带有打印机的设备监控状态的 ElasticSearch 数据可视化
- python - 将类应用于列表中的项目
- visual-studio - Visual Studio 2019 中的 Emacs 键绑定
- apache-spark - Spark Streaming如何保证多个foreachRDD的顺序
- javascript - 单击表单的搜索按钮时从 API 获取数据并在 React JS 的另一个页面上显示数据