我可以 select 在 Inno Setup 安装程序中使用脚本和命令行参数的 #include 路径吗?

Can I select an #include path using a script and command line args in an Inno Setup installer?

因此,问题出现在我有许多安装的地方,其中大部分内容都是相同的,当然除了安装中的文件。我有一套不同的包含文件。

所以我想,"Hey, lets simply add a command line argument to specify what file to include." 我可以从 Pascal 代码中的命令行参数中获取信息。

当我尝试使用 #include 中的信息时出现问题。预处理器似乎对 Pascal 脚本一无所知。这是有道理的,除了我想让它知道。例如,我不能这样做:

[Files]
#include "{code:GetMyArgument}"

或者这个:

[Files]
#include {param:foo|bar}

所以真正的问题是:如何设置 #include 以包含我在命令行参数中设置的路径文件?或其他一些动态方法......我能想到一个。我只是不喜欢我的方式:我不喜欢为此移动文件或动态更改文件内容的想法,我认为 my/this/these 解决方案有味道。有没有更好的方法?

我使用的是 Inno Setup 5.5.6(u) 版。

只需使用预处理器变量:

#include IncludePath

并在编译器的命令行中指定它的值:

ISCC.exe Example1.iss /DIncludePath=Other.iss

/D switch的含义:

/D<name>[=<value>] Emulate #define public <name> <value>

如果您使用的 Inno Setup IDE 不支持设置编译器的命令行参数(例如 Inno Script Studio),您可以将包含的脚本的文件名基于某些安装程序的选项,例如 AppIdAppNameOutputBaseFilename

例如,对于基于 AppName 的名称,使用:

#include SetupSetting("AppName") + ".iss"

请注意,只有当 #include 指令和对 SetupSetting preprocessor function 的调用位于相应的 [Setup] 部分指令之后时,这才有效。


另一种选择是反转包含。

.iss 是项目特定的,它包括一个共享 .iss:

具体项目.iss

; Project-specific settings
[Setup]
AppId=id
AppName=name

[Files]  
; Project specific files

; Include shared script
#include "shared.iss"

请注意,如果这些部分重复,那完全没问题。因此 shared.iss 可以再次包含 [Setup][Files] 部分以及其他指令和文件。