当前位置: 首页 > 知识库问答 >
问题:

在Inno Setup Pascal脚本中运行时评估预处理器宏

林龙野
2023-03-14

我使用Inno Setup#定义指令来定义安装程序中有关软件包的所有信息,然后使用其他指令来提取该字符串的部分。例如,使用以下命令,部件号(Package1)返回05414。

#define Package1 "05414 - My Package"
#define PartNumber(str Package) Copy(Package, 1, 5)

我在脚本和代码中使用这种方法,而且效果很好。然而,我遇到了一种情况,即通过编程生成字符串会很方便,而且我很难让它正常工作。例如,我想做以下事情。

procedure Foo(Package: String);
var
  PartNumber: String;
begin
  PartNumber:= ExpandConstant(Format('{#PartNumber(%s)}', [Package]));
end;

procedure Bar();
begin
   Foo(ExpandConstant('{#Package1}')); 
end;

FooPackage参数是正确的,但我收到一个编译器错误消息

[ISPP]格式“%”没有参数。

它似乎不喜欢零件编号行字符串中的 #。即使在普通字符串中包含 # 也会产生“未终止的预处理器指令”错误,所以我认为它将 # 解释为精确说明符或其他东西。

有没有办法让它将< code>#视为文本的一部分,这样我就可以以编程方式扩展这个常量?如果没有,是否有其他方法可以实现这一点?

共有1个答案

章昊
2023-03-14

这是行不通的。

部件号是一个预处理器函数/宏。它在编译时评估。它在运行时不存在。

当然,您可以实现等效的Pascal Script函数:

function PartNumberPascal(Package: string): string;
begin
  Result := Copy(Package, 1, 5);
end;

procedure Foo(Package: String);
var
  PartNumber: String;
begin
  PartNumber := PartNumberPascal(Package);
end;

可能让你困惑的是这个电话:

Foo(ExpandConstant('{#Package1}')); 

它可能会给您一种印象,即< code>ExpandConstant函数扩展了< code>Package1预处理程序定义。

它没有!

{#...} 语法(与 {...} 相反)不是常量。这是一个内联预处理器指令调用,其中,当未显式指定指令时,将隐含发出。所以 {#Package1}{#emit Package1} 相同。与每个预处理器构造一样,它在编译时进行评估。

如果将 SaveToFile 预处理器函数调用添加到脚本末尾:

procedure Bar();
begin
  Foo(ExpandConstant('{#Package1}')); 
end;

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

编译后,检查预处理的内容。iss是这样的。您将看到:

procedure Bar();
begin
  Foo(ExpandConstant('05414 - My Package')); 
end;

Package1已扩展为其值。但是ExandConstant仍然存在,因此它完全没用!('05414-My Package'中没有常量)

这将产生相同的效果:

procedure Bar();
begin
  Foo('{#Package1}'); 
end;

对于类似的问题,请参阅:
在Inno Setup Pascal Script中评估运行时来自预处理器的数据集合

 类似资料:
  • 我有一个关于邮递员的共享收藏。当我在共享集合中运行请求时,它失败并显示以下错误: 评估预先请求脚本时出错:错误:意外的令牌 我已经用几个请求试过了,最简单的请求是对“http://localhost:8000/v1/resource”的GET请求,没有参数、授权、头、正文或请求前脚本,仍然会出现上述错误。 检查邮递员的控制台时,我看到以下错误: JSONError:意外令牌' 和上面的那个吻合。

  • 问题内容: 来自我的Web应用程序的XML响应既有HTML添加到页面,又有一些要运行的脚本。 我正在尝试从Web应用发送回XML,例如: 我现在正在做的是抢购和CDATA,将html插入页面并评估。 我正在寻找对我的方法的批评。任何人有什么建议吗? 问题答案: 您宁愿发送JSON,它也更易于解释。例:

  • 我正试图发送一个邮件请求,以创建一个使用邮递员的用户。需要动态用户电子邮件和密码。 我正在尝试在新变量中赋值,从邮递员内置变量中的返回-

  • 我对使用JMeter的groovy是新手。我试图从groovy脚本中获取格林威治时间上午12:00的时间戳,并将其转换为Epoc计时器

  • 为了复制此场景,我编写了以下SQL脚本: 我已经使用IntelliJ运行了这个脚本,它按预期工作。 但是,当我将脚本放入@SQL注释中时,我遇到了以下错误: 这就产生了以下错误,这就更没有意义了: 最值得注意的是,删除BEGIN和END语句(只保留INSERT INTO语句)是可行的。 那么Spring JDBC不支持begin/end块吗?pretest@sql注释是否有我不知道的限制?还是我错

  • 问题内容: 我正在尝试创建用于设置Docker容器的Shell脚本。我的脚本文件如下所示: 运行此脚本文件将在新调用的bash中运行容器。 现在,我需要运行一个脚本文件(test.sh),该文件已经位于上述给定的shell脚本的容器内(例如:cd /path/to/test.sh && ./test.sh),该怎么做? 问题答案: 您可以使用以下命令在正在运行的容器中运行命令: 并从bash会话运