2010-02-24 6 views

Antwort

22

Sie sollten es der Lage sein, diese wie:.

(Ich habe dies vor kurzem nicht versucht, aber es hat funktioniert sicherlich im Jahr 2007 zurück, als ich auf diese Weise mit InnoSetup Es könnte einige geringfügige Änderungen erforderlich, wenn Inno Syntax hat sich seitdem verändert.)

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

Wenn MyMainFile.exe wurde Version 1.2.3.4 dann, die das fertige Installer ersetzen nur dort setup_mytool_1_2_3_4.exe

die AVF1, AVF2 usw. Zeug das ist nennen sollte Punkte (.) in der Versionsnummer mit unter scores (_), um Probleme mit Dingen zu vermeiden, die mit vielen Punkten in einem Dateinamen nicht umgehen können.

+0

schön! funktionierte gut, brauchte nur den MainBinaryName in Anführungszeichen :) (Ich editierte deine Antwort) –

+1

+1, ich wusste nicht, dass der Präprozessor dafür verwendet werden könnte. Wird meine Antwort entfernen. – mghie

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

Ein viel sauberer Weg, dies zu tun, die StringChange-Funktion beinhaltet, die mit etwas anderem zu ersetzen, die Punkte ermöglicht:

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

Auch, wenn Sie alle vier Versionsnummern nicht zeigen wollen (zB Sie es wollen 1.0.1 sagen, statt 1.0.1.0), können Sie die AppVersion Zeile mit dem folgenden ersetzen:

#define NumberOfVersionPoints 3 
#define AppVersion    Copy(GetFileVersion(AddBackslash(SourcePath) + MainBinaryName), 0, NumberOfVersionPoints * 2 - 1) 
+0

Der Code für 'NumberOfVersionPoints' funktioniert nur, wenn die Versionsnummer keine zweistelligen Elemente enthält (z. B." 1.2.10.0 "wird falsch in" 1.2.1 "konvertiert). – TypeIA

+0

@TypeIA Haben Sie eine Idee, wie Sie mit diesem Fall umgehen sollen? – Thunderforge

+0

Ich tat das damals nicht, aber ich fand eine Lösung auf der Inno-Mailingliste. Ich habe gerade eine neue Antwort geschrieben. Danke, dass du mich angefangen hast! – TypeIA

1

GetFileVersion() (in anderen Antworten beschrieben) gibt eine Zeichenfolge der Form "Major.Minor.Rev.Build" zurück. Wenn Sie Zugriff auf die einzelnen Elemente haben möchten, damit Sie die Zeichenfolge selbst formatieren können (wenn Sie beispielsweise nur "Major.Minor" oder "Major.Minor.Rev" möchten), können Sie den folgenden Ansatz aus der jrsoftware.innosetup mailing list:

verwenden
#define VerMajor 
#define VerMinor 
#define VerRev 
#define VerBuild 
#define FullVersion=ParseVersion('PathTo.exe', VerMajor, VerMinor, VerRev, VerBuild) 
#define MyAppVersion = Str(VerMajor) + "." + Str(VerMinor) 
Verwandte Themen