2009-03-06 13 views
6

में एक्शन अनुक्रम रिकॉर्ड बदलने के लिए स्क्रिप्ट listed here समस्या को हल करने के लिए मुझे InstallExecuteSequence को बदलना होगा। RemoveExistingProducts एक MSI में रिकॉर्ड करता है।एक एमएसआई

मैं चारों ओर ओर्का

साथ MSI_SetProperty.js स्क्रिप्ट mucking
+0

http://stackoverflow.com/questions/370940/visual-studio-2008-service-installer-project-upgrade-issue भी शामिल है, जो उद्धृत प्रश्न –

उत्तर

13

को संशोधित करने के बजाय निर्माण प्रक्रिया के हिस्से के रूप में ऐसा करना चाहते

// MSI_SetActionSequence.js <msi-file> <table> <action> <sequence> 
// Performs a post-build fixup of an msi to set the specified table/action/sequence 

// Constant values from Windows Installer SDK 
var msiOpenDatabaseModeTransact = 1; 

var msiViewModifyInsert   = 1; 
var msiViewModifyUpdate   = 2; 
var msiViewModifyAssign   = 3; 
var msiViewModifyReplace  = 4; 
var msiViewModifyDelete   = 6; 

if (WScript.Arguments.Length != 4) 
{ 
    WScript.StdErr.WriteLine("Usage: " + WScript.ScriptName + " file table action sequence"); 
    WScript.Quit(1); 
} 

var filespec = WScript.Arguments(0); 
var table = WScript.Arguments(1); 
var action = WScript.Arguments(2); 
var sequence = parseInt(WScript.Arguments(3)); 

var installer = WScript.CreateObject("WindowsInstaller.Installer"); 
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact); 

WScript.StdOut.WriteLine("Looking for action:" + action); 

try 
{ 
    var sql = "SELECT Action, Sequence FROM " + table + " WHERE Action = '" + action + "'"; 
    var view = database.OpenView(sql); 

    view.Execute();  
    var record = view.Fetch(); 

    if (record) 
    {  
     while (record) 
     { 
      WScript.StdOut.Write("Found: " + record.StringData(0) + ", " + record.StringData(1) + ", " + record.StringData(2)); 
      if (record.IntegerData(2) != sequence) 
      { 
       WScript.StdOut.WriteLine(" - changing to " + sequence); 
       record.IntegerData(2) = sequence; 
       view.Modify(msiViewModifyUpdate,record); 
      } 
      else 
       WScript.StdOut.WriteLine(" - OK"); 

      record = view.Fetch(); 
     } 

     view.Close(); 
     database.Commit(); 
    } 
    else 
    {   
     view.Close(); 
     throw("Warning - Could not find " + table + "." + action); 
    } 
} 
catch(e) 
{ 
    WScript.StdErr.WriteLine(e); 
    WScript.Quit(1); 
} 

कार्रवाई करने के लिए परिवर्तन प्रदर्शन करने के लिए इस स्क्रिप्ट कॉल करने के लिए देता है ऊपर वर्णित अनुक्रम आप निम्नलिखित को बैच फ़ाइल में डाल देंगे और पोस्ट बिल्ड इवेंट उदा PostBuildEvent = $ (ProjectDir) PostBuild.bat

cscript.exe MSI_SetActionSequence.js YOURINSTALLER.MSI InstallExecuteSequence RemoveExistingProducts 1525 
+0

का डुप्लिकेट है एमएस लिंक भी इंस्टॉलएक्सक्यूट को हटाने का उल्लेख करता है लाइन। क्या यह आवश्यक है? – RBear

+0

एआरएम - एमएस लिंक क्या है? मैं इसे एक वर्ष से अधिक के लिए उपयोग कर रहा हूं, ऐसा लगता है कि ठीक काम करता है। – Ryan

+0

आपकी दूसरी पोस्ट में से एक जो आप शीर्ष पर लिंक करते हैं http://social.msdn.microsoft.com/forums/en-US/winformssetup/thread/519faa07-5b4e-4546-bfb3-6f233bf7286f सीम किसी भी तरह से काम करने के लिए। – RBear

0

कुछ अन्य लोगों को कुछ नोट्स। मेरे पास "त्रुटि 1001 थी। निर्दिष्ट सेवा पहले से मौजूद है" समस्या, और उपरोक्त कोशिश की और यह काम नहीं कर रहा था। यहां मैंने जो किया है:

* सुनिश्चित करें कि आपके इंस्टॉलर प्रोजेक्ट पर RemovePreviousVersions प्रॉपर्टी सत्य पर सेट है। यह स्पष्ट प्रतीत होता है - स्पष्ट, यानी, यदि आप इसके बारे में जानते हैं। डिफ़ॉल्ट रूप से यह गलत पर सेट है। यदि गलत है, तो उपर्युक्त प्रक्रिया आपकी समस्या का समाधान नहीं करेगी। *

मेरे पास जीएसी में कुछ असेंबली स्थापित हैं। ऐसा प्रतीत होता है कि जब मैंने RemoveExistingProducts अनुक्रम को स्थानांतरित किया था कि इन फ़ाइलों को GAC से हटा दिया गया था, लेकिन पुनर्स्थापित नहीं किया गया था। इसे हल करने के लिए मैंने एप्लिकेशन फ़ोल्डर में सभी असेंबली स्थापित की। एफवाईआई, मैं वीएस -2010 का उपयोग कर रहा हूं।

इसके अलावा, एक और नाइट-पिक। यदि कोई उत्पाद किसी उत्पाद के उसी संस्करण को पुनर्स्थापित करने का प्रयास करते समय "मरम्मत" का चयन करता है, तो उन्हें अभी भी "निर्दिष्ट सेवा पहले से मौजूद" त्रुटि मिल जाएगी। अगर मुझे समय मिलता है तो मैं इसे ठीक करने की कोशिश करूंगा। अगर वहां कोई और जानता है कि इसे कैसे ठीक किया जाए, तो क्या आप पोस्ट कर सकते हैं?

यह सब कहा, इसे पोस्ट करने के लिए धन्यवाद!

0

रायन द्वारा प्रदान किया गया समाधान उस मुद्दे का हिस्सा है जिसका सामना मैं कर रहा हूं। यह इंस्टॉल के बाद, पूर्ण अनइंस्टॉल करता है।

हालांकि, मेरे पास एक और मुद्दा है, मेरे मामले में कुछ कार्यक्रम पृष्ठभूमि में चल रहे हैं। इंस्टॉलर चलने से पहले, इंस्टॉलर शिकायत करता है कि कुछ फाइलें उपयोग में हैं। और मानक संवाद बॉक्स को या तो एप्लिकेशन को बंद करने के लिए पूछता है, या अपडेट को पूरा करने के लिए पुनरारंभ करता है।

क्या कोई तरीका है, उदाहरण के लिए। पृष्ठभूमि में चल रही प्रक्रियाओं को मारने के लिए एक कस्टम एक्शन या सेटिंग, ताकि इंस्टॉलर आसानी से चला जाए?

+0

आप इसे एक उत्तर के रूप में यहां पोस्ट करने के बजाय अपने स्वयं के प्रश्न के रूप में पूछने से बेहतर हैं - एफएक्यू के शीर्ष दाएं को देखें। – Ryan

संबंधित मुद्दे