2010-02-24 4 views
10

क्या मुख्य निष्पादन योग्य फ़ाइल के फ़ाइल संस्करण को पढ़ने के लिए इनो सेटअप प्राप्त करना संभव है और "myapp_setup_1_0_3708_19805.exe" जैसे किसी भी सेटअप के लिए सेट सेटअप का नाम सेट करना संभव है?सेटअप फ़ाइल नाम निष्पादन योग्य फ़ाइल संस्करण संख्या से प्राप्त किया जा सकता है?

उत्तर

22

आप इस तरह यह करने के लिए सक्षम होना चाहिए:।

(मैं इस हाल ही में प्रयास नहीं किया है लेकिन यह निश्चित रूप जब मैं इस तरह से InnoSetup उपयोग कर रहा था 2007 में काम किया यह कुछ मामूली परिवर्तन की आवश्यकता हो सकती है, तो 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, बुलाना चाहिए आदि सामान सिर्फ वहाँ बदलने के लिए है नीचे दिए गए संस्करण संख्या में बिंदु (।) स्कोर (_) उन चीज़ों के साथ समस्याएं उत्पन्न करने से बचने के लिए जो फ़ाइल नाम में बहुत से बिंदुओं का सामना नहीं कर सकते हैं।

+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.0 के बजाय 1.0.1 कहना चाहता हूँ) तो आपको निम्न का AppVersion लाइन की जगह ले सकता:

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

'NumberOfVersionPoints' के लिए कोड केवल तभी काम करता है जब संस्करण संख्या में दो अंकों वाले तत्व नहीं होते हैं (उदाहरण के लिए, "1.2.10.0" गलत रूप से "1.2.1" में परिवर्तित हो जाता है)। – TypeIA

+0

@ टाइपिया क्या आपके पास इस मामले को संभालने का विचार है? – Thunderforge

+0

मैंने उस समय नहीं किया था, लेकिन मुझे इनो मेलिंग सूची पर एक समाधान मिला। मैंने अभी नीचे एक नया जवाब पोस्ट किया है। मुझे शुरू करने के लिए धन्यवाद! – TypeIA

1

GetFileVersion() (अन्य उत्तरों में वर्णित) "Major.Minor.Rev.build" फ़ॉर्म की एक स्ट्रिंग देता है। यदि आप अलग-अलग तत्वों तक पहुंच चाहते हैं ताकि आप स्ट्रिंग को स्वयं प्रारूपित कर सकें (कहें, अगर आप केवल "मेजर। मिनोर" या "मेजर.मिन्टर.रिव" चाहते हैं), तो आप 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)