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

Joh*_*ohn 4 inno-setup pascalscript

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

假设我传入/DMYVAR=1Inno Setup 引擎。

在我的 .iss 文件中,我可以有类似的内容:

[Setup]
AppName=MyApp v{#MYVAR}
Run Code Online (Sandbox Code Playgroud)

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

[Setup]
AppName=MyApp v{#MYVAR}
Run Code Online (Sandbox Code Playgroud)

这不起作用:(

Mar*_*ryl 8

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

因此{#name}语法(内联预处理器指令调用)在任何地方都适用,包括 Pascal Script。

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

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

#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
Run Code Online (Sandbox Code Playgroud)

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

function IsVersionOne(param: String): boolean;
begin
    Result := '1' = '1';
end;
Run Code Online (Sandbox Code Playgroud)

由于该值是一个数字,因此您当然也可以使用数字比较:

function IsVersionOne(param: String): boolean;
begin
    Result := {#MYVAR} = 1;
end;
Run Code Online (Sandbox Code Playgroud)

有关包含更详细信息的相关问题,请参阅Inno Setup Pascal Script 中的运行时评估预处理器宏


虽然上面回答了您的字面问题,但您的function签名实际上表明您想要实现一个Check函数来测试编译时指令的值,例如:

[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"; Check: IsVersionOne
Run Code Online (Sandbox Code Playgroud)

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

请改用预处理器#if指令

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

#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
Run Code Online (Sandbox Code Playgroud)

如果使用 运行编译器/DMYVAR=1Preprocessed.iss将显示:

[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"
Run Code Online (Sandbox Code Playgroud)

如果您使用不同的 值运行编译器DMYVARPreprocessed.iss将显示:

[Files]
Run Code Online (Sandbox Code Playgroud)

如果您需要在没有开关的情况下编译脚本/DMYVAR=,请在脚本顶部定义一个默认值,例如:

#ifndef MYVAR
#define MYVAR "0"
#endif
Run Code Online (Sandbox Code Playgroud)