【问题标题】:Can I select an #include path using a script and command line args in an Inno Setup installer?我可以在 Inno Setup 安装程序中使用脚本和命令行参数选择 #include 路径吗?
【发布时间】:2016-02-02 15:24:53
【问题描述】:

所以问题出现在我有许多安装的地方,除了安装中的文件之外,大多数东西都是相同的。我有一套不同的包含文件。

所以我想,“嘿,让我们简单地添加一个命令行参数来指定要包含的文件。”我可以从 Pascal 代码中的命令行参数获取信息。

当我尝试使用#include 中的信息时,问题就来了。预处理器似乎对 Pascal 脚本一无所知。这是有道理的,只是我想让它知道。例如,我不能这样做:

[Files]
#include "{code:GetMyArgument}"

或者这个:

[Files]
#include {param:foo|bar}

所以问题真的是:如何设置#include 以包含我在命令行参数中设置的路径文件?或其他一些动态方法...我能想到一个。我只是不喜欢我的方式:我不喜欢为此移动文件或动态更改文件内容的想法,我的/这个/这些解决方案有异味,我想。有没有更好的办法?

我正在使用 Inno Setup 的 5.5.6(u) 版本。

【问题讨论】:

    标签: command-line-arguments inno-setup pascalscript


    【解决方案1】:

    只需使用预处理器变量:

    #include IncludePath
    

    并在编译器的命令行中指定它的值:

    ISCC.exe Example1.iss /DIncludePath=Other.iss
    

    /D switch的含义:

    /D<name>[=<value>] Emulate #define public <name> <value>
    

    如果您使用的 Inno Setup IDE 不支持设置编译器的命令行参数(例如 Inno Script Studio),您可以将包含的脚本文件名基于某些安装程序的选项,例如 AppIdAppName、@ 987654329@等

    例如,对于基于 AppName 的名称,使用:

    #include SetupSetting("AppName") + ".iss"
    

    请注意,这仅在 #include 指令以及对 SetupSetting preprocessor function 的调用位于相应的 [Setup] 部分指令之后时才有效。


    另一种选择是反转包含。

    主要的.iss 是特定于项目的,它包括一个共享的.iss

    项目特定.iss:

    ; Project-specific settings
    [Setup]
    AppId=id
    AppName=name
    
    [Files]  
    ; Project specific files
    
    ; Include shared script
    #include "shared.iss"
    

    请注意,如果部分重复,则完全可以。所以shared.iss 可以再次包含[Setup][Files] 部分以及其他指令和文件。

    【讨论】:

    • 编译时得到:未声明的标识符:“IncludePath”。
    • 你给我看问题了……我想……看来我已经到了 Inno Script Studio 的极限了。它似乎在原始命令行上工作。 (谢谢)
    • @amalgate:也许你可以试试 Visual & Installer (www.visual-installer.com) 或 RAD & Installer (www.rad-installer.com) 工具,而不是 Inno Script Studio。完全支持这个命令行的东西。
    • 我其实是打算用命令行的,所以很开心。我们拥有的安装程序已经相当成熟,只是进行了更改以减少对实习生的需求。无论如何,感谢您的替代方案和您的解决方案。它工作得很好。并感谢您提供更多详细信息。我很遗憾我只有一个 +1 可以给。
    最近更新 更多