为什么预处理器在 #include 指令中的行为与在 [Files] 部分 Inno Setup 脚本中的行为不同

Why preprocessor behaves differently in #include directive then in [Files] section Inno Setup script

在使用宏搜索和查找文件时,试图了解将包含另一个脚本文件的语法与 Inno Setup 脚本中的源文件之间的区别。

我尝试使用 中的 FindFolder 函数:

#define FindFolder(Path) \
    Local[0] = FindFirst(Path, faDirectory), \
    Local[0] ? AddBackslash(ExtractFileDir(Path)) + FindGetFileName(Local[0]) : Path

像这样:

#include "{#FindFolder('..\..\..\packages\ScriptPreRequisites*')}\DotNetDependencies.iss"

# 内,您位于 Inno Setup preprocessor 的 "realm"。

进入预处理器领域有两种方法。

  • 整行语法:

    #directive args
    
  • 和内联语法:

    {#directive args}
    

    内联语法几乎专门用于 emit directive - {#emit <expression>}。由于这个原因,有一个 shorthand 格式,省略了 emit{#<expression>}.

当您想在预处理器领域之外使用预处理器表达式时,内联语法很有用。与正常的 Inno Setup 部分(或 Pascal Script 代码)一样:

[Files]
Source: "{#FindFolder("..\packages\PackagesA*")}\*.*"; DestDir: "{app}"; \
    flags: recursesubdirs  

虽然在#include preprocessor directive,但您已经处于预处理器领域。在那里,{#xxx} 语法无效(理论上它甚至可能具有不同的 [valid] 含义,但实际上大括号在预处理器中没有用)。

#include指令的语法是:

#include <expression>

预处理器使用 C-like expression syntax。所以你在这种情况下的表达是:

FindFolder('..\..\..\packages\ScriptPreRequisites*') + '\DotNetDependencies.iss'