Inno setup 安装文件名是否可以从可执行文件版本号派生?
是否可以让Inno Setup读取主可执行文件的文件版本,并将创建的安装程序的名称设置为类似“myapp\u Setup\u 1\u 0\u 3708\u 19805.exe”的名称?您应该可以这样做: (我最近没有尝试过这个方法,但它肯定可以追溯到2007年我以这种方式使用InnoSetup的时候。如果从那时起Inno的语法发生了变化,它可能需要一些轻微的更改。) 如果MyMainFile.exe的版本是1.2.3.4,那么应该调用完成的安装程序setup\u mytool\u 1\u 2\u 3\u 4.exeInno setup 安装文件名是否可以从可执行文件版本号派生?,inno-setup,Inno Setup,是否可以让Inno Setup读取主可执行文件的文件版本,并将创建的安装程序的名称设置为类似“myapp\u Setup\u 1\u 0\u 3708\u 19805.exe”的名称?您应该可以这样做: (我最近没有尝试过这个方法,但它肯定可以追溯到2007年我以这种方式使用InnoSetup的时候。如果从那时起Inno的语法发生了变化,它可能需要一些轻微的更改。) 如果MyMainFile.exe的版本是1.2.3.4,那么应该调用完成的安装程序setup\u mytool\u 1\u 2\u
AVF1、AVF2等东西只是用来将版本号中的点(.)替换为下划线(u),以避免无法处理文件名中大量点的内容出现问题。一种更干净的方法是使用
StringChange
函数,该函数允许用其他内容替换点:
; Get the App Version from Main Program
; This Is Full App Version Major.Minor.Build.Revision
; Store First 3 Parts of Version in ShortAppVersion to be used for SBS Assembly Installation Major.Minor.Build
#dim Version[4]
#expr ParseVersion("MainProgram.exe", Version[0], Version[1], Version[2], Version[3])
#define AppVersion Str(Version[0]) + "." + Str(Version[1]) + "." + Str(Version[2]) + "." + Str(Version[3])
#define ShortAppVersion Str(Version[0]) + "." + Str(Version[1]) + "." + Str(Version[2])
#define MainBinaryName "MyMainFile.exe"
#define SourcePath "Path/To/File"
#define SetupBaseName "setup_mytool_"
#define AppVersion GetFileVersion(AddBackslash(SourcePath) + MainBinaryName)
#define AppVersionFile StringChange(AppVersion, ".", "_")
[Setup]
OutputBaseFilename={#SetupBaseName + AppVersionFile}
此外,如果您不想显示所有四个版本号(例如,您想让它显示1.0.1
而不是1.0.1.0
),可以用以下内容替换AppVersion
行:
#define NumberOfVersionPoints 3
#define AppVersion Copy(GetFileVersion(AddBackslash(SourcePath) + MainBinaryName), 0, NumberOfVersionPoints * 2 - 1)
GetFileVersion()
(在其他答案中描述)返回一个格式为“Major.Minor.Rev.Build”的字符串。如果您希望访问各个元素,以便自己格式化字符串(例如,如果您只需要“Major.Minor”或“Major.Minor.Rev”),则可以使用以下方法:
美丽的!工作得很好,只需要引号中的mainbaryname:)(我编辑了你的答案)+1,我不知道预处理器可以用于此。将删除我的答案。
NumberOfVersionPoints
的代码只有在版本号不包含任何两位数元素时才有效(例如,“1.2.10.0”错误地转换为“1.2.1”)。@TypeIA你知道如何处理这种情况吗?当时我没有,但我在Inno邮件列表中找到了解决方案。我刚刚在下面发布了一个新答案。谢谢你让我开始!
#define NumberOfVersionPoints 3
#define AppVersion Copy(GetFileVersion(AddBackslash(SourcePath) + MainBinaryName), 0, NumberOfVersionPoints * 2 - 1)
#define VerMajor
#define VerMinor
#define VerRev
#define VerBuild
#define FullVersion=ParseVersion('PathTo.exe', VerMajor, VerMinor, VerRev, VerBuild)
#define MyAppVersion = Str(VerMajor) + "." + Str(VerMinor)