预处理器不关心它的指令在哪里展开。
所以{#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;
有关更详细信息的相关问题,请参阅Evaluate preprocessor macro on run time in Inno Setup Pascal Script。
虽然上面回答了您的字面问题,但您的function 签名实际上表明您想要实现Check function 来测试编译时指令的值,例如:
[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