7

我有一個MSI安裝程序,我需要從命令行添加或修改短文本屬性。如何從命令行添加/更新MSI中的屬性?

這必須在安裝程序構建完成後完成;我無法首先修改生成安裝程序的進程。它也必須從腳本無頭執行。

當我說「屬性」時,它可能是一個MSI屬性,在安裝時被寫入註冊表的值,或任何其他機制,它可以在運行時將這個簡短的自定義文本放入已安裝的應用程序中。

回答

12

例VBScript中,你可以用它來更新(或增加)的屬性後建立...

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 

欲瞭解更多信息,請查閱Windows安裝SDK(該Windows SDK的一部分),還有一堆示例腳本,您可以使用命令行,以執行各種操作MSI任務,例如WiRunSQL.vbs可讓您針對MSI執行任意SQL。

+2

更改軟件包時,請勿忘記更新摘要信息流中的軟件包代碼。儘管即使您使用不同的值發佈多個.msi文件,更改屬性值也不太可能導致實際問題,但它仍然是您需要執行的操作。 – 2009-10-23 13:27:13

+0

我只發現創建轉換時需要更新摘要信息,您需要更新所有更改的任何原因? – saschabeaumont 2009-10-23 23:47:41

+0

http://msdn.microsoft.com/en-us/library/aa370568(VS.85).aspx – 2009-11-23 15:20:22

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

有關更多信息,請在命令行中鍵入msiexec。

編輯:或使用SQL語句和更新屬性表中的屬性更改.msi文件本身: http://msdn.microsoft.com/en-us/library/aa372021(VS.85).aspx http://msdn.microsoft.com/en-us/library/aa368568(VS.85).aspx

+0

我以爲INSTALLS具有新的屬性。我不想安裝,我需要修改MSI文件。 – 2009-10-22 19:17:10

+0

我認爲這不值得贊同,因爲這符合OP的問題所指定的標準。構建後,是一個MSI屬性,當然是「任何其他機制,它可以在運行時將這個簡短的自定義文本放入已安裝的應用程序中。」它不會改變MSI本身,但在安裝程序的運行時執行此操作實際上是相同的結果。 – SpellingD 2012-03-29 18:54:51

+0

@ZippyV感謝您分享鏈接! – Rama 2013-04-15 06:34:54

0

這是在'09添加到@saschabeaumont的答案。目前使用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

這不是dotnet代碼。 – Crono 2016-03-14 13:20:09

+0

不知何故,最新的一張由@asarenski發佈,但saschabeaumont之前的版本在msi中沒有改變。 +1 – Prasoon 2016-04-26 12:55:51