我觉得这必须是我想要的简单 - 在Inno Setup中,如果我传入一个指令变量,我如何在[Code]
部分内使用它?
说我将/DMYVAR=1
传递给Inno Setup引擎。
在我的.iss文件中我可以有类似的内容:
[Setup]
AppName=MyApp v{#MYVAR}
在我的[Code]
部分中,我希望能够像这样使用它:
function IsVersionOne(param: String): boolean;
begin
Result := {#MYVAR} == "1";
end;
这不起作用:(
答案 0 :(得分:3)
预处理器不关心,它的指令被扩展。
所以{#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