Можно ли заставить Inno Setup прочитать версию файла основного исполняемого файла и установить имя созданной установки, например, «myapp_setup_1_0_3708_19805.exe»?
Может ли имя файла установки быть получено из номера версии исполняемого файла?
Ответы (3)
Вы должны быть в состоянии сделать это следующим образом:
(Я не пробовал это в последнее время, но это определенно работало в 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
#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}
2_3_4.exe.
AVF1, AVF2 и т. д. просто заменяют точки (.) в номере версии символами подчеркивания (_), чтобы избежать проблем с вещами, которые не могут справиться с большим количеством точек в имени файла.
Гораздо более чистый способ сделать это — использовать функцию 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)
NumberOfVersionPoints
работает только в том случае, если номер версии не содержит двузначных элементов (например, 1.2.10.0 неправильно преобразуется в 1.2.1).
- person TypeIA; 26.07.2017
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)