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

Можно ли заставить Inno Setup прочитать версию файла основного исполняемого файла и установить имя созданной установки, например, «myapp_setup_1_0_3708_19805.exe»?


person Keith Nicholas    schedule 24.02.2010    source источник


Ответы (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 и т. д. просто заменяют точки (.) в номере версии символами подчеркивания (_), чтобы избежать проблем с вещами, которые не могут справиться с большим количеством точек в имени файла.

person Leo Davidson    schedule 24.02.2010
comment
красивая! работал хорошо, просто нужно было MainBinaryName в кавычках :) (я отредактировал ваш ответ) - person Keith Nicholas; 25.02.2010
comment
+1, я не знал, что для этого можно использовать препроцессор. Будет удален мой ответ. - person mghie; 25.02.2010

Гораздо более чистый способ сделать это — использовать функцию 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)
person Thunderforge    schedule 16.10.2013
comment
Код для NumberOfVersionPoints работает только в том случае, если номер версии не содержит двузначных элементов (например, 1.2.10.0 неправильно преобразуется в 1.2.1). - person TypeIA; 26.07.2017
comment
@TypeIA У вас есть идея, как поступить в этом случае? - person Thunderforge; 26.07.2017
comment
В то время я этого не делал, но нашел решение в списке рассылки Inno. Я только что опубликовал новый ответ ниже. Спасибо за начало! - 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)
person TypeIA    schedule 26.07.2017