2010-02-24 94 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) 
相關問題