Inno setup 如何获取当前Inno安装脚本文件的文件名?

Inno setup 如何获取当前Inno安装脚本文件的文件名?,inno-setup,Inno Setup,我想获取当前Inno安装脚本文件的名称,以便在它之后命名生成的安装程序包。例如,如果当前的Inno安装脚本文件是“MyAppSetup.iss”,我希望生成的安装文件是“MyAppSetup.exe” 生成的安装文件的名称由Inno setup的[setup]部分中的OutputBaseFilename声明控制,因此如果有Inno setup预处理器变量返回当前脚本文件的名称,那就太好了。比如: OutputBaseFilename={#SourceFileName}.exe 不幸的是,没有I

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

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

OutputBaseFilename={#SourceFileName}.exe

不幸的是,没有Inno设置预处理器变量
{SourceFileName}
。我知道
{#SourcePath}
变量,但它返回脚本文件的目录路径,而不返回文件名。使用一些预定义的Inno Setup预处理器变量,但似乎没有一个返回当前脚本文件的名称。我希望
\uuuu文件\uuuuu
变量在读取列表中变量的描述后可以工作,但它返回一个空字符串。

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

[ISPP]
#define ScriptFileName "MyAppSetup"

[Setup]
AppPublisher={#AppPublisher}
OutputBaseFilename={#ScriptFileName}Setup
然后,您需要做的就是编辑文件顶部的一个引用

更新 我遇到过这样的情况,它说:

您可以使用:

#expr SetSetupSetting("OutputBaseFilename", sFileName)
然而,困难的部分是自动查找文件名。 您可以使用以下ISPP函数执行其他操作 ISPP内置函数无法完成的编译时任务:

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

ReadIni
函数:读取结果 并将其合并到脚本中

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

但还有另一种说法:

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

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


我个人认为批量文件编译是一种可行的方法。

这是不可能的。有,但它有一个值,仅用于
#include
d文件


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

#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}

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

使用
BaseName
如下:

[Setup]
OutputBaseFilename={#BaseName}
[Setup]
OutputBaseFilename={#BaseName}