7

Tengo un instalador de MSI en el que necesito agregar o modificar una propiedad de texto breve desde la línea de comandos.¿Cómo agrego/actualizo una propiedad dentro de una MSI desde la línea de comandos?

Esto tiene que hacerse después de que se haya construido el instalador; No puedo modificar el proceso que produce el instalador en primer lugar. También debe ejecutarse sin cabeza desde un script.

Cuando digo "propiedad", podría ser una propiedad MSI, un valor que se escribe en el registro en el momento de la instalación o cualquier otro mecanismo que pueda obtener este texto corto personalizado en la aplicación instalada cuando se ejecuta.

Respuesta

12

Ejemplo de VBScript que se puede utilizar para actualizar (o añadir) un post propiedad construir ...

Option Explicit 

Const MSI_FILE = "myfile.msi" 


Dim installer, database, view 

Set installer = CreateObject("WindowsInstaller.Installer") 
Set database = installer.OpenDatabase (MSI_FILE, 1) 

' Update 
Set view = database.OpenView ("UPDATE Property SET Value = '" & myproperty & "' WHERE Property = 'MYPROPERTY'") 

' .. or Add (Insert) 
Set view = database.OpenView ("INSERT INTO Property (Property, Value) VALUES ('MYPROPERTY', '" & myproperty & "')") 
view.Execute 


Set database = Nothing 
Set installer = Nothing 
Set view = Nothing 

para obtener más información, visite el SDK de Windows Installer (parte de la Windows SDK), hay un montón de scripts de ejemplo que puede utilizar desde la línea de comandos para realizar diversas tareas de manipulación de MSI, por ejemplo, WiRunSQL.vbs le permite ejecutar SQL arbitrario contra un MSI.

+2

No olvide actualizar el código del paquete en el Resumen de flujo de información cuando cambie el paquete. Si bien es poco probable que el cambio de un valor de propiedad cause problemas reales, incluso si libera varios archivos .msi con diferentes valores, aún así es algo que debe hacer. –

+0

Solo he descubierto que necesito actualizar la Información de resumen al crear las transformaciones, ¿por qué necesita actualizar para todos los cambios? – saschabeaumont

+0

http://msdn.microsoft.com/en-us/library/aa370568(VS.85).aspx –

5
c:\> msiexec /i yourmsi.msi THEPROPERTYNAME=valueofproperty 

Para obtener más información, escriba msiexec en la línea de comandos.

EDIT: o cambiar el archivo .msi sí mediante el uso de sentencias SQL y actualización de la característica en la tabla de propiedades: http://msdn.microsoft.com/en-us/library/aa372021(VS.85).aspx http://msdn.microsoft.com/en-us/library/aa368568(VS.85).aspx

+0

Pensé que INSTALLS con una nueva propiedad. No quiero instalar, necesito MODIFICAR el archivo MSI. –

+0

No creo que esto haya merecido el voto a favor, ya que cumple los criterios especificados por la pregunta de OP. Post-build, es una propiedad de MSI, y es sin duda "cualquier otro mecanismo que puede obtener este texto personalizado corto en la aplicación instalada cuando se ejecuta". No está alterando el MSI, pero hacerlo en el tiempo de ejecución del instalador es efectivamente el mismo resultado. – SpellingD

+0

@ZippyV ¡Gracias por compartir los enlaces! – Rama

0

Esto se agrega a la respuesta de @saschabeaumont en '09. Actualmente usando dotNet 4.0

Option Explicit 

Const MSI_FILE = "myFilePath.msi" 
Const PROPERTY_STRING_Value = "FooBar" 

Dim installer, database, view 

Set installer = CreateObject("WindowsInstaller.Installer") 
Set database = installer.OpenDatabase (MSI_FILE, 1) 

' Update 
Set view = database.OpenView ("UPDATE Property SET Value = '" & PROPERTY_STRING_Value & "' WHERE Property = 'MYPROPERTY'") 

' .. or Add (Insert) 
Set view = database.OpenView ("INSERT INTO Property (Property, Value) VALUES ('MYPROPERTY', '" & PROPERTY_STRING_Value & "')") 

view.Execute() 
database.Commit() 

Set database = Nothing 
Set installer = Nothing 
Set view = Nothing 
+0

Esto no es código de red. – Crono

+0

de alguna manera la última publicada por @asarenski funcionó pero la anterior por saschabeaumont no hizo cambios en msi. +1 – Prasoon

Cuestiones relacionadas