Может ли имя файла установки быть выведено из номера версии исполняемого файла?

Можно ли заставить 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)