« Power User Windows Registry Tweaks | Main | Visual Studio.NET Express Beta 1 require... »

Just a quickie today, someone wanted me to give them a list of all the files that were inside an Windows Installer (MSI) and I remembered that MSI's were databases (Access?) so:

Option Explicit
Const msiOpenDatabaseModeReadOnly = 0
Dim installer : Set installer = Nothing
Dim WshShell : Set WshShell = CreateObject("Wscript.Shell")
Dim szMSI : szMSI = WScript.Arguments.Item(0)
Dim folder : folder = WshShell.CurrentDirectory
Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
Dim database : Set database = installer.OpenDatabase(szMSI, msiOpenDatabaseModeReadOnly)
Dim View, Record
Set View = database.OpenView("SELECT FileName FROM File") 'could include FileSize, etc
View.Execute
Do
 Set Record = View.Fetch
 If Record Is Nothing Then Exit Do
 Wscript.Echo Record.StringData(1)
Loop
Set View = Nothing
Wscript.Quit(0)

You call it like this: cscript WhateverFileName.vbs YourInstallerDatabase.msi



Thursday, July 01, 2004 3:36:16 AM (Pacific Standard Time, UTC-08:00)
A small enhancement?

I ran this on one of my MSI files and noticed that the output contains both short and long file names.
I extended the code to allow the caller to manage how the value is output.

The default is to display the long file name.

Sample calls:

'Output long file names
cscript ListMsiFiles.vbs YourInstallerDatabase.msi

'Output short file names implicitly
cscript ListMsiFiles.vbs YourInstallerDatabase.msi 0

'Output long file names explicitly
cscript ListMsiFiles.vbs YourInstallerDatabase.msi 1

'Output unprocessed filenames
cscript ListMsiFiles.vbs YourInstallerDatabase.msi 2

ListMsiFiles.vbs
================
Option Explicit

Const msiOpenDatabaseModeReadOnly = 0

' Filename may contain both short and long filenames
' These constants enable us to specify which form we want
Const fileNameTypeShort = 0
Const fileNameTypeLong = 1
Const fileNameTypeBoth = 2

Dim installer : Set installer = Nothing

Dim WshShell : Set WshShell = CreateObject("Wscript.Shell")

Dim szMSI : szMSI = WScript.Arguments.Item(0)

Dim fileNameType : fileNameType = fileNameTypeLong

If WScript.Arguments.Count > 1 Then
fileNameType = WScript.Arguments.Item(1)
End If

Dim folder : folder = WshShell.CurrentDirectory
Set installer = Wscript.CreateObject("WindowsInstaller.Installer")

Dim database : Set database = installer.OpenDatabase(szMSI, msiOpenDatabaseModeReadOnly)

Dim View, Record
Set View = database.OpenView("SELECT FileName FROM File") 'could include FileSize, etc

View.Execute

Dim fileNameString 'As String
Dim fileNameParts 'As String()

Dim isSplitRequired : isSplitRequired = False

Do
Set Record = View.Fetch
If Record Is Nothing Then Exit Do

fileNameString = Record.StringData(1)

If fileNameType = fileNameTypeBoth Then
isSplitRequired = False
Else
If Instr(fileNameString, "|") > -1 Then
isSplitRequired = True
End if
End If

If isSplitRequired Then
fileNameParts = Split(fileNameString, "|")
Wscript.Echo fileNameParts(fileNameType)
Else
Wscript.Echo fileNameString
End if

Loop

Set View = Nothing

Wscript.Quit(0)
Martin Naughton
Comments are closed.

Contact

Sponsors

Hosting By

Hot Topics

Tags

Calendar

<February 2010>
SunMonTueWedThuFriSat
31123456
78910111213
14151617181920
21222324252627
28123456
78910111213

Archives

February, 2010 (8)
January, 2010 (13)
December, 2009 (13)
November, 2009 (7)
October, 2009 (19)
September, 2009 (11)
August, 2009 (12)
July, 2009 (21)
June, 2009 (26)
May, 2009 (16)
April, 2009 (13)
March, 2009 (17)
February, 2009 (17)
January, 2009 (18)
December, 2008 (32)
November, 2008 (17)
October, 2008 (22)
September, 2008 (16)
August, 2008 (14)
July, 2008 (25)
June, 2008 (19)
May, 2008 (17)
April, 2008 (17)
March, 2008 (26)
February, 2008 (21)
January, 2008 (28)
December, 2007 (19)
November, 2007 (17)
October, 2007 (31)
September, 2007 (39)
August, 2007 (37)
July, 2007 (43)
June, 2007 (37)
May, 2007 (32)
April, 2007 (38)
March, 2007 (29)
February, 2007 (46)
January, 2007 (31)
December, 2006 (27)
November, 2006 (31)
October, 2006 (32)
September, 2006 (39)
August, 2006 (34)
July, 2006 (40)
June, 2006 (18)
May, 2006 (31)
April, 2006 (34)
March, 2006 (30)
February, 2006 (38)
January, 2006 (44)
December, 2005 (19)
November, 2005 (34)
October, 2005 (24)
September, 2005 (37)
August, 2005 (20)
July, 2005 (24)
June, 2005 (33)
May, 2005 (16)
April, 2005 (22)
March, 2005 (34)
February, 2005 (15)
January, 2005 (37)
December, 2004 (28)
November, 2004 (30)
October, 2004 (34)
September, 2004 (22)
August, 2004 (34)
July, 2004 (18)
June, 2004 (64)
May, 2004 (49)
April, 2004 (21)
March, 2004 (29)
February, 2004 (29)
January, 2004 (36)
December, 2003 (25)
November, 2003 (24)
October, 2003 (59)
September, 2003 (42)
August, 2003 (24)
July, 2003 (44)
June, 2003 (29)
May, 2003 (21)
April, 2003 (30)
March, 2003 (27)
February, 2003 (47)
January, 2003 (50)
December, 2002 (31)
November, 2002 (38)
October, 2002 (44)
September, 2002 (15)
May, 2002 (2)
April, 2002 (4)

Google Ads