Можно ли заставить Inno Setup прочитать версию файла основного исполняемого файла и установить имя созданной установки на что-то вроде "myapp_setup_1_0_3708_19805.exe"?
Может ли имя файла установки быть выведено из номера версии исполняемого файла?
Ответ 1
Вы должны уметь так:
(Я не пробовал это недавно, но он, безусловно, работал в 2007 году, когда я использовал InnoSetup таким образом. Возможно, это потребует незначительных изменений, если синтаксис Inno изменился с тех пор.)
#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 и т.д. просто заменяют точки (.) в номере версии символами подчеркивания (_), чтобы избежать проблем с вещами, которые не могут справиться с большим количеством точек в имени файла.
Ответ 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])
Ответ 3
Более чистый способ сделать это включает использование функции 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)
Ответ 4
GetFileVersion()
(описанный в других ответах) возвращает строку формы "Major.Minor.Rev.Build". Если вы хотите получить доступ к отдельным элементам, чтобы вы могли самостоятельно форматировать строку (например, если вы хотите только "Major.Minor" или "Major.Minor.Rev" ), вы можете использовать следующий подход из список рассылки jrsoftware.innosetup:
#define VerMajor
#define VerMinor
#define VerRev
#define VerBuild
#define FullVersion=ParseVersion('PathTo.exe', VerMajor, VerMinor, VerRev, VerBuild)
#define MyAppVersion = Str(VerMajor) + "." + Str(VerMinor)