2010-02-24 88 views

回答

22

您应该能够像这样:

(我最近没有试过,但,当我以这种方式使用InnoSetup它肯定工作早在2007年,它可能需要一些细微的变化,如果创新科技的语法自那时以来已经改变了。)

#define MainBinaryName "MyMainFile.exe" 
#define SetupBaseName "setup_mytool_" 
#define AppVersion  GetFileVersion(AddBackslash(SourcePath) + MainBinaryName) 
#define AVF1   Copy(AppVersion, 1, Pos(".", AppVersion) - 1) + "_" + Copy(AppVersion, Pos(".", AppVersion) + 1) 
#define AVF2   Copy(AVF1,  1, Pos(".", AVF1  ) - 1) + "_" + Copy(AVF1  , Pos(".", AVF1  ) + 1) 
#define AppVersionFile Copy(AVF2,  1, Pos(".", AVF2  ) - 1) + "_" + Copy(AVF2  , Pos(".", AVF2  ) + 1) 

[Setup] 
OutputBaseFilename={#SetupBaseName + AppVersionFile} 

如果MyMainFile.exe是1.2.3.4版本,那么应该调用完成安装setup_mytool_1_2_3_4.exe

的AVF1,AVF2等东西只是为了更换点号(。)的版本号与下分数(_)以避免导致无法处理文件名中大量点的问题。

+0

漂亮!工作得很好,只需要引号中的MainBinaryName :)(我编辑了你的答案) – 2010-02-25 00:19:47

+1

+1,我不知道预处理器可以用于那个。将删除我的答案。 – mghie 2010-02-25 04:53:47

2
; 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]) 
2

做这包括使用StringChange功能,可以用别的东西代替点更清洁的方式:

#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) 
+0

仅当版本号不包含任何两位数元素(例如,“1.2.10.0”错误地转换为“1.2.1”)时,NumberOfVersionPoints的代码才有效。 – TypeIA 2017-07-26 05:19:11

+0

@TypeIA你有想法如何处理这种情况? – Thunderforge 2017-07-26 05:58:18

+0

我当时没有,但我在Inno邮件列表上找到了一个解决方案。我刚刚在下面发布了一个新答案。感谢让我开始! – TypeIA 2017-07-26 13:07:37

1

GetFileVersion()(在其他答案中描述)返回一个形式为“Major.Minor.Rev.Build”的字符串。如果要访问各个元素,以便可以自己格式化字符串(例如,如果您只需要“Major.Minor”或“Major.Minor.Rev”),则可以使用以下方法:jrsoftware.innosetup mailing list

#define VerMajor 
#define VerMinor 
#define VerRev 
#define VerBuild 
#define FullVersion=ParseVersion('PathTo.exe', VerMajor, VerMinor, VerRev, VerBuild) 
#define MyAppVersion = Str(VerMajor) + "." + Str(VerMinor) 
相关问题