我想获取当前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__
变量在读取列表中变量的描述后能够正常工作,但它会返回一个空字符串。
答案 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。
我个人认为批处理文件编译是可行的方法。