7

J'ai un programme d'installation MSI dans lequel j'ai besoin d'ajouter ou de modifier une propriété de texte court à partir de la ligne de commande.Comment ajouter/mettre à jour une propriété dans un MSI à partir de la ligne de commande?

Ceci doit être fait après la construction du programme d'installation; Je ne peux pas modifier le processus qui produit l'installateur en premier lieu. Il doit également être exécuté sans tête à partir d'un script. Lorsque je dis "propriété", il peut s'agir d'une propriété MSI, une valeur qui est écrite dans le registre au moment de l'installation ou de tout autre mécanisme permettant d'obtenir ce court texte personnalisé dans l'application installée lors de son exécution.

Répondre

12

Exemple VBScript que vous pouvez utiliser pour mettre à jour (ou ajouter) un post immobilier construire ...

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 

pour plus d'informations, consultez le Windows Installer SDK (partie du Windows SDK), il y a un tas d'exemples de scripts que vous pouvez utiliser à partir de la ligne de commande pour effectuer diverses tâches de manipulation MSI, par exemple WiRunSQL.vbs vous permet d'exécuter du SQL arbitraire par rapport à un MSI.

+2

N'oubliez pas de mettre à jour le code du package dans le flux d'informations récapitulatives lorsque vous modifiez le package. Il est peu probable que la modification d'une valeur de propriété entraîne des problèmes réels, même si vous libérez plusieurs fichiers .msi avec des valeurs différentes, c'est toujours quelque chose que vous devez faire. –

+0

J'ai seulement trouvé que j'ai besoin de mettre à jour les informations récapitulatives lors de la création de transformations, quelle que soit la raison pour laquelle vous devez mettre à jour toutes les modifications? – saschabeaumont

+0

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

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

Pour plus d'informations, tapez msiexec sur la ligne de commande.

EDIT: ou modifier le fichier .msi lui-même en utilisant des instructions SQL et mettre à jour la propriété dans le tableau des propriétés: http://msdn.microsoft.com/en-us/library/aa372021(VS.85).aspx http://msdn.microsoft.com/en-us/library/aa368568(VS.85).aspx

+0

Je pensais que INSTALLATIONS avec une nouvelle propriété. Je ne veux pas installer, j'ai besoin de MODIFIER le fichier MSI. –

+0

Je ne pense pas que cela méritait le downvote, car cela correspondait aux critères spécifiés par la question OP. Post-build, est une propriété MSI, et est certainement "tout autre mécanisme qui peut obtenir ce court texte personnalisé dans l'application installée lors de son exécution." Cela ne modifie pas le MSI lui-même, mais le faire à l'exécution de l'installateur est effectivement le même résultat. – SpellingD

+0

@ZippyV Merci de partager les liens! – Rama

0

Ceci est à ajouter à la réponse de @saschabeaumont en '09. Actuellement en utilisant 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

Ce n'est pas un code dotnet. – Crono

+0

en quelque sorte le dernier posté par @asarenski travaillé mais le précédent par saschabeaumont n'a fait aucun changement dans msi. +1 – Prasoon