2009-03-06 9 views
6

Um ein Problem zu lösen listed here Ich muss den InstallExecuteSequence .RemoveExistingProducts Datensatz in einem MSI ändern.Skript zum Ändern der Action Sequence Datensätze in einem MSI

Ich möchte lieber dies als Teil des Build-Prozesses tun, als herumschlagen mit Orca

+0

deckt auch http://stackoverflow.com/questions/370940/visual-studio-2008-service-installer-project-upgrade-issue, die die zitierte Frage ist ein dup von –

Antwort

13

Ändern der MSI_SetProperty.js Skript

gibt
// 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); 
} 

dieses Skript aufrufen, die Änderung der Aktion auszuführen Sequenz, die oben erwähnt wurde, würden Sie das folgende in eine Stapeldatei setzen und das vom Nachbauereignis zB anrufen PostBuildEvent = $ (ProjectDir) PostBuild.bat

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

Der MS-Link erwähnt auch das Entfernen der InstallExecute Linie. Ist das erforderlich? – RBear

+0

Erm - was MS-Link? Ich benutze dies seit über einem Jahr, scheint gut zu funktionieren. – Ryan

+0

Die in Ihrem anderen Beitrag, zu dem Sie oben verlinkt sind http://social.msdn.microsoft.com/forums/en-US/winformssetup/thread/519faa07-5b4e-4546-bfb3-6f233bf7286f Nähte funktionieren auf jeden Fall. – RBear

0

Einige Hinweise für andere da draußen. Ich hatte das Problem "Fehler 1001. Der angegebene Dienst existiert bereits" und versuchte das obige und es schien nicht zu funktionieren. Hier ist, was ich lief:

* Stellen Sie sicher, dass die RemovePreviousVersions -Eigenschaft in Ihrem Installationsprojekt auf True festgelegt ist. Dies scheint offensichtlich - das ist offensichtlich, wenn Sie es wissen. Standardmäßig ist es auf False gesetzt. Wenn Falsch ist, löst das obige Verfahren Ihr Problem nicht. *

Ich habe einige Baugruppen in der GAC installiert. Es scheint, dass beim Verschieben der RemoveExistingProducts-Sequenz diese Dateien aus dem GAC entfernt, aber nicht erneut installiert wurden. Um dies zu beheben, habe ich alle Assemblys im Anwendungsordner installiert. Zu Ihrer Information, ich benutze VS2010.

Auch ein anderer Nissen. Wenn ein Benutzer "Reparieren" auswählt, wenn er versucht, die gleiche Version eines Produkts erneut zu installieren, wird immer noch der Fehler "Der angegebene Dienst ist bereits vorhanden" angezeigt. Wenn ich Zeit bekomme, werde ich versuchen, das zu beheben. Wenn jemand da draußen weiß, wie man es repariert, könntest du es posten?

Alles, was gesagt hat, danke für das Posten!

0

Die Lösung von Ryan behandelt einen Teil des Problems, vor dem ich stehe. Es führt eine vollständige Deinstallation durch, gefolgt von der Installation.

Allerdings habe ich ein anderes Problem, in meinem Fall laufen einige der Programme im Hintergrund. Bevor das Installationsprogramm ausgeführt werden kann, beschwert sich das Installationsprogramm darüber, dass einige der Dateien verwendet werden. Das Standarddialogfeld fragt, ob die Anwendung geschlossen oder neu gestartet werden soll, um die Aktualisierung abzuschließen.

Gibt es einen Weg, z. eine benutzerdefinierte Aktion oder eine Einstellung, um die Prozesse im Hintergrund zu beenden, damit das Installationsprogramm reibungslos funktioniert?

+0

Sie sollten diese Frage lieber als Ihre eigene FRAGE stellen, anstatt sie hier als ANTWORT zu veröffentlichen - sehen Sie sich die FAQ oben rechts an. – Ryan

Verwandte Themen