Inno Setup 中的#emit 指令有什么意义?

What is the point of the #emit directive in Inno Setup?

以下是来自 #emit directive documentation 的示例:

[Files]
#emit 'Source: "file1.ext"; DestDir: {' + MyDestDir + '}'
Source: "file2.ext"; DestDir: {#MyDestDir}
#emit GenerateVisualCppFilesEntries ; user defined function

第一行的DestDir部分我没看懂。看起来那里缺少 # 符号。

第二行我明白了。但是为什么我们需要像第 1 行那样使用 #emit 指令呢?

Inno Setup preprocessor directives 可以使用两种语法调用。

基本语法:

#directive params

以及内联语法:

{#directive params}

最重要的是,#emit directive 是默认的 内联 指令,如果没有指定明确的指令名称,则假定。


所以这三个是等价的:

#emit MyDestDir
{#emit MyDestDir}
{#MyDestDir}

虽然第一个对于 path 变量没有意义,因为它会导致无效的脚本语法——但它可以与包含有效脚本语法的变量一起使用:

#define FileSectionEntry 'Source: ' + MySource + '; DestDir: ' + MyDestDir
#emit FileSectionEntry

虽然其他两个内联示例可能有意义,但只有在同一行上有其他代码,例如您问题中的代码:

Source: "file2.ext"; DestDir: {#MyDestDir}

此外,带有(字符串)常量的 #emit 基本上没有意义,因为您可以在没有预处理器的情况下实现相同的目的。

这三个是等价的:

Source: "file2.ext"; DestDir: "{app}"
#emit 'Source: "file2.ext"; DestDir: "{app}"'
{#'Source: "file2.ext"; DestDir: "{app}"'}

所以回到你脚本中的代码,这些(几乎)是等价的:

#emit 'Source: "file1.ext"; DestDir: {' + MyDestDir + '}'
Source: "file1.ext"; DestDir: {#MyDestDir}

唯一的问题是我认为第一行的大括号不应该存在。该行应该是:

#emit 'Source: "file1.ext"; DestDir: ' + MyDestDir

我已经提交了 fix for this. It's basically another copy of the typo from your previous question: Why is there an additional pair of curly braces on the Inno Setup Preprocessor:#emit page?