2010-02-24 5 views

답변

22

당신은 이런 식으로 할 수 있어야합니다.

(나는 최근에 시도하지 않은하지만이 방법으로 InnoSetup 사용되었을 때 확실히 2007 년에 다시 일이 약간의 변경이 필요할 수 있습니다 이노의 구문 경우 그 이후로 변경되었습니다.)

#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 등 물건이를 대체 할 그냥

setup_mytool_1_2_3_4.exe 완성 된 설치 관리자 AVF1, AVF2를 호출해야 다음 버전 1.2.3.4 인 경우 밑줄이있는 버전 번호의 점 (.) 파일 이름에 많은 점들을 감당할 수없는 경우 문제가 발생하지 않도록 점수 (_)를 지정하십시오.

+0

아름다운! 단지 따옴표로 MainBinaryName 필요, 잘 작동 :) 내가 전처리가 사용될 수 있습니다 몰랐 –

+1

+1 (나는 당신의 대답을 편집). 내 대답을 제거 할거야. – 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

이 뭔가 다른 점을 교체 할 수있는 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.01.0.1을 말하고 싶은), 다음으로 AppVersion 라인을 대체 할 수

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

버전 번호에 두 자리 요소가 포함되어 있지 않으면 (예 : "1.2.10.0"이 "1.2.1"로 잘못 변환 됨) 'NumberOfVersionPoints'코드가 작동합니다. – TypeIA

+0

@TypeIA는 당신이 그 사건을 처리하는 방법에 대한 아이디어가 있습니까? – Thunderforge

+0

나는 시간에하지 않았다,하지만 난 이노 메일 링리스트에 대한 해결책을 발견했다. 방금 아래에 새로운 답변을 올렸습니다. 시작해 주셔서 감사합니다. – TypeIA

1

GetFileVersion() (다른 답변에 설명되어 있음)은 "Major.Minor.Rev.Build."형식의 문자열을 반환합니다. 당신이 문자열을 포맷 할 수 있도록 개별 요소에 액세스하려면 (당신은 단지 "는 Major.Minor"또는 "Major.Minor.Rev"를 원하는 경우 말) 자신, 당신은 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) 
관련 문제