Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inno setup 安装文件名是否可以从可执行文件版本号派生?_Inno Setup - Fatal编程技术网

Inno setup 安装文件名是否可以从可执行文件版本号派生?

Inno 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

是否可以让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.exe


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)