如何在 [Code] 部分使用 Inno Setup 预处理器指令?

How to use Inno Setup preprocessor directive in [Code] section?

我觉得这一定是我所缺少的一些简单的东西 - 在 Inno Setup 中,如果我传入了一个指令变量,我如何在 [Code] 部分中使用它?

假设我将 /DMYVAR=1 传递给 Inno Setup 引擎。

在我的 .iss 文件中,我可以有类似的东西:

[Setup]
AppName=MyApp v{#MYVAR}

在我的 [Code] 部分,我希望能够像这样使用它:

function IsVersionOne(param: String): boolean;
begin
    Result := {#MYVAR} == "1";
end;

这行不通:(

预处理器不关心它的指令在哪里扩展。

因此 {#name} 语法 (inline preprocessor directive call) 在任何地方都适用,包括 Pascal 脚本。

不过,如果您想将 define 值作为一个字符串进行比较,您当然必须将其用引号括起来,使其成为一个字符串。另请注意,您的 == "1" 语法错误,Pascal 使用单 = 和单引号。

function IsVersionOne(param: String): boolean;
begin
    Result := '{#MYVAR}' = '1';
end;

#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")

运行用/DMYVAR=1编译,并检查生成的Preprocessed.iss。它将显示:

function IsVersionOne(param: String): boolean;
begin
    Result := '1' = '1';
end;

因为是数字,当然也可以用数值比较:

function IsVersionOne(param: String): boolean;
begin
    Result := {#MYVAR} = 1;
end;

有关具有更详细信息的相关问题,请参阅


虽然上面回答了你的 字面问题 ,你的 function 签名实际上表明你想要实现 Check function 来测试 compile-time 指令,例如:

[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"; Check: IsVersionOne

这是一种低效的矫枉过正。

改用preprocessor #if directive

[Files]
#if MYVAR == "1"
Source: "MYPROG.EXE"; DestDir: "{app}"
#endif

#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")

如果您 运行 带有 /DMYVAR=1 的编译器,Preprocessed.iss 将显示:

[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"

如果您运行 编译器具有不同的 DMYVAR 值,Preprocessed.iss 将显示:

[Files]

如果即使没有 /DMYVAR= 开关也需要编译脚本,请在脚本顶部定义一个默认值,例如:

#ifndef MYVAR
#define MYVAR "0"
#endif