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



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

我试着在Inno Setup中使用通配符查找目录中的FindFolder函数:

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

像这样:

#include "{#FindFolder('......packagesScriptPreRequisites*')}DotNetDependencies.iss"

#中,您处于Inno Setup预处理器的"领域"。

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

  • 整行语法:

    #directive args
    
  • 和内联语法:

    {#directive args}
    

    内联语法几乎只用于emit指令-{#emit <expression>}。出于这个原因,有一种省略了emit的简写格式:{#<expression>}

当您希望在预处理器领域之外使用预处理器表达式时,内联语法非常有用。类似于正常的Inno设置部分(或Pascal脚本代码(:

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

尽管在#include预处理器指令中,您已经进入了预处理器领域。在那里,{#xxx}语法是无效的(理论上它甚至可能有不同的[valid]含义,但实际上花括号在预处理器中没有用处(。

#include指令的语法为:

#include <expression>

预处理器使用类似C的表达式语法。因此,在这种情况下,您的表达式是:

FindFolder('......packagesScriptPreRequisites*') + 'DotNetDependencies.iss'

相关内容

最新更新