7

私はコマンドラインから短いテキストプロパティを追加または変更する必要のあるMSIインストーラを持っています。MSI内のプロパティをコマンドラインから追加/更新するにはどうすればよいですか?

これは、インストーラの作成後に行う必要があります。最初にインストーラを作成するプロセスを変更することはできません。また、スクリプトからヘッドレスで実行する必要があります。

「プロパティ」とは、MSIプロパティ、インストール時にレジストリに書き込まれる値、または実行時にこの短いカスタムテキストをインストールされたアプリケーションに取得できる任意のメカニズムです。

答えて

12

例VBScriptのアップデートに使用できる(または追加) WindowsインストーラSDK(Windows SDKの一部)をチェックしてください詳細については...

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 

を構築し、あなたは例えば、様々なMSI操作タスクを実行するために、コマンドラインから使用できるサンプルスクリプトの束がありますWiRunSQL.vbsを使用すると、MSIに対して任意のSQLを実行できます。

+2

パッケージを変更するときに、要約情報ストリームでパッケージコードを更新することを忘れないでください。プロパティ値を変更すると、複数の.msiファイルを異なる値でリリースしても、実際に問題が発生する可能性は低いですが、依然として必要なことです。 –

+0

私は、トランスフォームを作成するときに要約情報を更新する必要があることを知りました。すべての変更を更新する必要がある理由は何ですか? – saschabeaumont

+0

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

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

詳細については、コマンドラインでmsiexecと入力してください。

EDIT:または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ファイルを変更する必要があります。 –

+0

これは、OPの質問で指定された基準に適合しているので、これがダウンボントに値するとは思わない。ポストビルドはMSIのプロパティであり、確かに「実行時にこの短いカスタムテキストをインストールされたアプリケーションに取り込むことができる他のすべてのメカニズム」です。 MSI自体は変更されていませんが、インストーラのランタイムでこれを実行することは事実上同じ結果になります。 – SpellingD

+0

@ZippyVリンクを共有してくれてありがとう! – Rama

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

これはドットネットコードではありません。 – Crono

+0

何とか@asarenskiによって投稿された最新のものが働いていましたが、saschabeaumontの前のものはmsiに変更がありませんでした。 +1 – Prasoon

関連する問題