【问题标题】:How to get the file name of the current Inno Setup script file?如何获取当前 Inno Setup 脚本文件的文件名?
【发布时间】:2016-07-07 09:16:29
【问题描述】:

我想获取当前 Inno Setup 脚本文件的名称,以便为生成的安装包命名。例如,如果当前的 Inno Setup 脚本文件是“MyAppSetup.iss”,我希望生成的安装文件是“MyAppSetup.exe”。

生成的安装文件的名称由 Inno Setup 的 [Setup] 部分中的 OutputBaseFilename 声明控制,因此如果有一个 Inno Setup 预处理器变量返回当前脚本文件的名称,那就太好了。比如:

OutputBaseFilename={#SourceFileName}.exe

不幸的是,没有 Inno Setup 预处理器变量{#SourceFileName}。我知道{#SourcePath} 变量,但它返回脚本文件的目录路径,但没有文件名。 Here's a list 带有一些预定义的 Inno Setup 预处理器变量,但它们似乎都没有返回当前脚本文件的名称。我希望__FILE__ 变量在读取列表中变量的描述后能够工作,但它返回一个空字符串。

【问题讨论】:

    标签: inno-setup


    【解决方案1】:

    这是不可能的。有__FILE__,但它的值仅适用于#included 文件。


    如果您在一个目录中从未有多个.iss 文件,则可以使用FindFirst 查找其名称。

    #define ScriptFindHandle = FindFirst(SourcePath + "\*.iss", 0)
    #if !ScriptFindHandle
      #error "No script found"
    #endif
    #define SourceFileName = FindGetFileName(ScriptFindHandle)
    #if FindNext(ScriptFindHandle)
      #error "More than one script found"
    #endif
    #expr FindClose(ScriptFindHandle)
    #define SourceBaseName = RemoveFileExt(SourceFileName)
    

    然后在 [Setup] 部分中的当前脚本文件之后命名设置文件,您应该使用:

    [Setup]
    OutputBaseFilename={#SourceBaseName}
    

    但如果您要自动编译大量安装程序,我假设您使用命令行编译。因此,您可以简单地在父批处理文件(或类似脚本)中传递脚本名称:

    set SCRIPT=MyAppSetup
    "C:\Program Files (x86)\Inno Setup 5\ISCC.exe" %SCRIPT%.iss /DBaseName=%SCRIPT%
    

    使用BaseName 喜欢:

    [Setup]
    OutputBaseFilename={#BaseName}
    

    【讨论】:

      【解决方案2】:

      我知道这不是你想要的,但你为什么不能这样做:

      [ISPP]
      #define ScriptFileName "MyAppSetup"
      
      [Setup]
      AppPublisher={#AppPublisher}
      OutputBaseFilename={#ScriptFileName}Setup
      

      然后,您只需编辑文件顶部的一个引用。

      更新

      我遇到了这个link,上面写着:

      你可以使用:

      #expr SetSetupSetting("OutputBaseFilename", sFileName)
      

      但是,困难的部分是自动查找文件名。 您可以使用以下 ISPP 功能来做额外的 ISPP 内置函数无法完成的编译时任务:

      Exec函数:执行一个外部程序来做附加的 功能,并将结果写入 INI 文件。默认执行 等待进程完成。

      ReadIni函数:读取结果 从 INI 文件中提取,并将其合并到脚本中。

      如何确定文件名取决于您。也许你可以 枚举窗口并从 Inno Setup 中提取文件名 窗口标题,但因为您可能有多个 Inno Setup 副本打开,你必须找到一个可靠的方法来做到这一点。英诺补充道 [Compiling] 在编译期间添加到标题,这样更容易 查找正在使用的副本,但其中可能有多个副本 编译状态。您可以绝对确定哪个副本是 通过检查父进程 ID 来运行程序 过程,您可以使用Process32First/Process32Next 和 检查您的进程的32ParentProcessID。工作太多,我 知道..

      但是还有一条评论:

      (但是,如果您正在执行自动构建,则可以设置输出 命令行中的文件名——这可能就足够了 你真的想要。)

      那么您是否考虑过使用批处理文件和命令行?然后,您可以在编译中使用批处理线的好处。 here 提供了有关在批处理文件中使用当前文件名的信息。

      我个人认为批处理文件编译是要走的路。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-12
        • 2017-02-12
        • 1970-01-01
        • 2022-10-19
        • 2011-08-13
        • 1970-01-01
        • 2022-06-22
        • 1970-01-01
        相关资源
        最近更新 更多