如何获取当前Inno Setup脚本文件的文件名?

时间:2016-07-07 09:16:29

标签: inno-setup

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

生成的安装文件的名称由Inno Setup的OutputBaseFilename部分中的[Setup]声明控制,因此,如果有Inno Setup预处理器变量,则返回名称当前的脚本文件会很棒。类似的东西:

OutputBaseFilename={#SourceFileName}.exe

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

2 个答案:

答案 0 :(得分:1)

这是不可能的。有__FILE__,但它只有#include d个文件的值。

如果目录中永远不会有多个.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}

答案 1 :(得分:0)

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

[ISPP]
#define ScriptFileName "MyAppSetup"

[Setup]
AppPublisher={#AppPublisher}
OutputBaseFilename={#ScriptFileName}Setup

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

更新

我遇到了link,其中指出:

  

您可以使用:

#expr SetSetupSetting("OutputBaseFilename", sFileName)
     

但是,困难的部分是自动查找文件名。   您可以使用以下ISPP功能执行其他操作   编译时任务不能由ISPP内置函数完成:

     

Exec功能:执行外部程序以执行其他操作   功能,并将结果写入INI文件。默认执行   等待过程结束。

     

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

     

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

但还有另一条评论:

  

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

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

我个人认为批处理文件编译是可行的方法。