11

当社のお客様の多くは、InstallShield、WISE、または AdminStudio にアクセスできます。これらは問題ありません。私は、商用の再パッケージ ツールにアクセスできない小規模な顧客に、ファイルの置き換えを自分で行うための無料で利用できる一連のツールと手順を提供できる方法があることを望んでいます。

圧縮された MSI 内の 1 つの構成ファイルを置き換えるだけで済みます。ターゲット ユーザーは既に Orca をインストールしていると想定でき、これを使用してプロパティ テーブルをカスタマイズする方法 (GPO 展開のライセンスの詳細を埋め込むため) を知っており、MST ファイルを生成しています。 .



免責事項:これは別の質問と非常に似ていますが、そのスレッドの質問と回答の両方が明確ではありません.

4

5 に答える 5

9

さて、私自身の答えでこの質問を再検討し、すべての面倒な作業を行う素敵な小さなVBスクリプトを提供します. 元の質問で述べたように、その目的は、sysadmin ユーザーが自分で更新/変更を行うための簡単なソリューションを提供することでした。

以下は、現在お客様に提供しているコードの簡略版です

Option Explicit

Const MY_CONFIG = "MyConfigApp.xml"
Const CAB_FILE = "config.cab"
Const MSI = "MyApp.msi"

Dim filesys : Set filesys=CreateObject("Scripting.FileSystemObject")

If filesys.FileExists("temp.tmp") Then filesys.DeleteFile("temp.tmp")
filesys.CopyFile MSI, "temp.tmp"

Dim installer, database, database2, view
Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase ("temp.tmp", 1)
Set database2 = installer.OpenDatabase (MSI, 1)

If Not filesys.FileExists(MY_CONFIG) Then WScript.Quit 2 ' No config file, abort!

Dim objFile, size, result, seq, objCab

' MakeCab object has been depreciated so we fallback to makecab.exe for with Windows 7
On Error Resume Next ' Disable error handling, for a moment
Set objCab = CreateObject("MakeCab.MakeCab.1") 
On Error Goto 0  ' Turn error handling back on

If IsObject(objCab) Then ' Object creation successful - use XP method   
    objCab.CreateCab CAB_FILE, False, False, False
    objCab.AddFile MY_CONFIG, filesys.GetFileName(MY_CONFIG)
    objCab.CloseCab
    Set objCab = Nothing
Else ' object creation failed - try Windows 7 method
    Dim WshShell, oExec
    Set WshShell = CreateObject("WScript.Shell")
    Set oExec = WshShell.Exec("makecab " & filesys.GetFileName(MY_CONFIG) & " " & CAB_FILE)
End If

Set objFile = filesys.GetFile(MY_CONFIG)
size = objFile.Size

Set view = database.OpenView ("SELECT LastSequence FROM Media WHERE DiskId = 1")
view.Execute
Set result = view.Fetch
seq = result.StringData(1) + 1 ' Sequence for new configuration file

Set view = database.OpenView ("INSERT INTO Media (DiskId, LastSequence, Cabinet) VALUES ('2', '" & seq & "', '" & CAB_FILE & "')")
view.Execute

Set view = database.OpenView ("UPDATE File SET FileSize = " & size & ", Sequence = " & seq & ", FileName = 'MYC~2.CNF|MyConfigApp.xml' WHERE File = '" & MY_CONFIG & "'")
view.Execute

database.GenerateTransform database2, "CustomConfig.mst"
database.CreateTransformSummaryInfo database2, "CustomConfig.mst", 0, 0
filesys.DeleteFile("temp.tmp")

Set view = nothing
Set installer = nothing
Set database = nothing
Set database2 = nothing
Set filesys = Nothing
WScript.Quit 0

更新: MakeCab.MakeCab.1オブジェクトは廃止され、Windows 7 で動作するようにコードが更新されました。

于 2009-02-06T04:21:15.713 に答える
2

msiファイルはご自身で作成されていると思います(?)

Wixを使用して msi を生成する場合、顧客はファイルを置き換えた後に msi 全体を再生成するだけです (wix は無料です)。それ以外の場合は、msi に埋め込まれていない非圧縮ファイルを使用できるはずです。wix では、キャビネット属性なしでメディア要素を追加する必要があります。欠点は、単一の msi ではなく、2 つのファイルを配布する必要があることです。

于 2008-11-26T10:12:33.170 に答える
1

Mediaテーブルにエントリを追加し、キャビネットファイルのない別のメディアを追加し、LastSequenceをCABファイルの最後のシーケンスより1つ多く追加する必要があります。次に、ファイルテーブルでファイルのシーケンスを新しいファイルに置き換え、変更された可能性のある他のすべてのファイル属性を更新する必要があります。

于 2008-11-26T07:30:09.520 に答える