2009-03-06 16 views

Respuesta

13

Modificación de la secuencia de comandos MSI_SetProperty.js da

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

llamar a este script para realizar el cambio a la acción secuencia mencionada anteriormente pondría lo siguiente en un archivo por lotes y lo llamará desde el evento de compilación posterior, por ejemplo PostBuildEvent = $ (ProjectDir) PostBuild.bat

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

El enlace MS también menciona la eliminación de InstallExecute línea. Es esto requerido? – RBear

+0

Erm - ¿qué enlace MS? Llevo más de un año usando esto, parece funcionar bien. – Ryan

+0

El de la otra publicación a la que se vincula en la parte superior http://social.msdn.microsoft.com/forums/en-US/winformssetup/thread/519faa07-5b4e-4546-bfb3-6f233bf7286f Costuras para trabajar de cualquier forma. – RBear

0

Algunas notas a otros por ahí. Tuve el problema "Error 1001. El servicio especificado ya existe" e intenté lo anterior y no pareció funcionar. Esto es lo que encontré:

* Asegúrese de que la propiedad RemovePreviousVersions en su proyecto de instalador esté configurada en True. Esto parece obvio, obvio, es decir, si lo sabes. Por defecto está configurado en False. Si es falso, el procedimiento anterior no resolverá su problema. *

Tengo algunos ensambles instalados en el GAC. Parece que cuando moví la secuencia RemoveExistingProducts, estos archivos se eliminaron del GAC, pero no se volvieron a instalar. Para resolver esto, instalé todos los ensamblajes en la carpeta de la aplicación. FYI, estoy usando VS2010.

Además, otra selección de liendres. Si un usuario selecciona "Reparar" cuando intenta reinstalar la misma versión de un producto, seguirá recibiendo el error "El servicio especificado ya existe". Si tengo tiempo, intentaré arreglar esto. Si alguien más sabe cómo solucionarlo, ¿podría publicar?

Todo lo dicho, ¡gracias por publicar esto!

0

La solución proporcionada por Ryan aborda parte del problema que estoy enfrentando. Realiza la desinstalación completa, seguida de la instalación.

Sin embargo, tengo otro problema, en mi caso, algunos de los programas se ejecutan en segundo plano. Antes de que el instalador pueda ejecutarse, el instalador se queja de que algunos de los archivos están en uso. Y le da un cuadro de diálogo estándar para cerrar la aplicación o reiniciar para completar la actualización.

¿Hay alguna manera, por ejemplo. una acción personalizada o una configuración, para matar los procesos que se ejecutan en el fondo para que el instalador funcione sin problemas?

+0

Será mejor que pregunte esto como su propia PREGUNTA en lugar de publicarla aquí como una RESPUESTA. Consulte la sección de preguntas frecuentes en la parte superior derecha. – Ryan

Cuestiones relacionadas