« 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

<November 2009>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

Archives

November, 2009 (2)
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