问题
I'm using Visual Studio 2008 and have created a setup project for my application. The application has a high-resolution icon (for Vista). There's a bug in Visual Studio, and the installer creates a desktop shortcut with a low resolution icon.
I logged this bug in Microsoft Connect (https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=338258) and finally got an answer, which is to use Orca to edit the msi file and replace the icon. That solutions works fine.
Now I want to automate that process, so I can include it in my build script. Is there a way to do that?
回答1:
You can write VBS, JS (using cscript, which is built in with every Windows) to modify the MSI, the syntax is pretty much SQL like. Here is a MSDN page that shows various examples.
回答2:
Possibly the easiest solution that I found for this was to create a new "Transform" inside of Orca, and then to apply the transform as a part of my post-build steps.
1) Open the MSI file using ORCA for editing. 2) Click on "New transform" 3) Make all of the applicable changes to your MSI tables using the Orca editor. 4) Click on "Generate transform", and save the file. 5) Edit your build events to execute msitran during the post-build step. like this...
msitran -a (path to transform file) (path to MSI file)
More information about MSITran.exe can be found at the following location... MSITran
This will automatically apply your edits to the MSI file once your installer build has completed, eliminating the need for custom VBScript.
回答3:
I just had to do this too - here is my VBScript file (in case it's useful to anyone)...
Dim msiInstaller
Dim msiDatabase
Dim msiView
Dim msiRecord
Dim pathToMsiFile
Dim pathToIconFile
If WScript.Arguments.Count <> 2 Then
WScript.Echo "Usage:" & vbCrLf & " " & WScript.ScriptName & " <path-to-msi> <path-to-icon>"
WScript.Quit
End If
Dim pathToMsi, pathToIcon
pathToMsi = WScript.Arguments(0)
pathToIcon = WScript.Arguments(1)
Set msiInstaller = CreateObject("WindowsInstaller.Installer")
Set msiRecord = msiInstaller.CreateRecord(1)
msiRecord.SetStream 1, pathToIcon
Set msiDatabase = msiInstaller.OpenDatabase(pathToMsi, 1)
Set msiView = msiDatabase.OpenView("UPDATE Icon SET Data = ? WHERE Name <> ''")
msiView.Execute msiRecord
msiDatabase.Commit
This script replaces all shortcut icons in the MSI database with a single icon - if you need to be selective then you have some more work to do.
回答4:
You can use perl script to modify the installer msi package. You can use Win32 OLE for this. Open the MSI using Win32::OLE->new
API. Open the MSI database and execute the SQL queries to do the update.
This perl script can be used in builds.
This link might help you to write the required one.
回答5:
Since you're used to work with Orca, just save the modifications as a transform file using Orca and then applying it with 'msitran' in the post build event of your setup project.
I'm using this in a setup project and it works just great.
来源:https://stackoverflow.com/questions/886842/use-orca-to-edit-msi-from-command-line