2010-02-24 5 views

Répondre

22

Vous devriez pouvoir comme ceci:.

(je n'ai pas essayé récemment, mais il a certainement travaillé en 2007 quand j'utilisais InnoSetup de cette façon, il pourrait avoir besoin de légères modifications si la syntaxe de Inno a changé depuis.)

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

Si MyMainFile.exe était la version 1.2.3.4 alors que devrait appeler le programme d'installation terminé setup_mytool_1_2_3_4.exe

le AVF1, AVF2, etc. truc est juste là pour remplacer le points (.) dans le numéro de version avec sous scores (_) pour éviter de causer des problèmes avec des choses qui ne peuvent pas faire face à beaucoup de points dans un nom de fichier.

+0

belle! a bien fonctionné, juste besoin le MainBinaryName guillemets :) (j'edited votre réponse) –

+1

+1, je ne savais pas le préprocesseur pourrait être utilisé pour cela. Va enlever ma réponse. – 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

Une façon beaucoup plus propre de faire cela consiste à utiliser la fonction StringChange, ce qui permet de remplacer les points avec quelque chose d'autre:

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

De plus, si vous ne voulez pas montrer tous les quatre numéros de version (par exemple, vous voulez dire 1.0.1 au lieu de 1.0.1.0), vous pouvez remplacer la ligne AppVersion ce qui suit:

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

Le code de 'NumberOfVersionPoints' ne fonctionne que si le numéro de version ne contient pas d'éléments à deux chiffres (par exemple, « 1.2.10.0 » convertit à tort « 1.2.1 »). – TypeIA

+0

@TypeIA Avez-vous une idée de la façon de gérer ce cas? – Thunderforge

+0

Je ne l'avais pas à l'époque, mais j'ai trouvé une solution sur la liste de diffusion Inno. Je viens de poster une nouvelle réponse ci-dessous. Merci de m'avoir initié! – TypeIA

1

GetFileVersion() (décrit dans d'autres réponses) retourne une chaîne de caractères de la forme « Major.Minor.Rev.Build. » Si vous souhaitez accéder aux éléments individuels de sorte que vous pouvez formater la chaîne vous-même (par exemple, si vous voulez seulement « Major.Minor » ou « Major.Minor.Rev »), vous pouvez utiliser l'approche suivante du 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)