Installing a MSI is fairly straightforward.  Here's an example of installing python without any gui prompting to a designated directory.
msiexec /i "python-2.7.9.amd64.msi" /passive TARGETDIR="C:\tools\python2"
But how do I know about the TARGETDIR option I hear you say? Amazingly the msiexec binary can't tell you what parameters (public external properties) the MSI will accept.  TARGETDIR 
appears to be a standard installshield property, but the MSI can expose others.  The 
only way I found that doesn't require additional tools was to enumerate the parameters by dropping the MSI onto this piece of VBScript:
Call GetArguments(ArgArray) 
If IsArray(ArgArray) then 
For Each ArrayElement In ArgArray 
Wscript.Echo GetMSIProperties(ArrayElement) 
Next 
Else 
WScript.Echo "Drag and drop MSI-File over the Script" 
End if 
' ---------------------------------------- 
Private Function GetMSIProperties(strMSIFile) 
Dim oWI : Set oWI = CreateObject("WindowsInstaller.Installer") 
Dim oDB : Set oDB = oWI.OpenDatabase(strMSIFile, 2) 
Dim oView : Set oView = oDB.OpenView("Select * From Property") 
Dim oRecord 
oView.Execute 
Do 
Set oRecord = oView.Fetch 
If oRecord Is Nothing Then Exit Do 
iColumnCount = oRecord.FieldCount 
rowData = Empty 
delim = " " 
For iColumn = 1 To iColumnCount 
If iColumn = iColumnCount Then delim = vbLf 
rowData = rowData & oRecord.StringData(iColumn) & delim 
Next 
strMessage = strMessage & rowData 
Loop 
Set oRecord = Nothing 
Set oView = Nothing 
Set oDB = Nothing 
Set oWI = Nothing 
GetMSIProperties = strMessage 
End Function 
' ---------------------------------------- 
Private Function GetArguments(SourceArray) 
Dim iCount : iCount = 0 
If wscript.arguments.count > 0 then 
ReDim ArgArray(wscript.arguments.count -1) 
For Each Argument in wscript.arguments 
ArgArray(iCount) = Argument 
iCount = iCount +1 
Next 
iCount = Null 
GetArguments = ArgArray 
End if 
End Function 
Which will pop up a GUI window with information about the MSI including the available properties.  If you're building MSIs regularly you probably already have the relevant SDK installed and can use 
Orca to 
inspect the property table.
 
No comments:
Post a Comment