|
|
' Windows Installer database table import for use with Windows Scripting Host ' Copyright (c) 1999, Microsoft Corporation ' Demonstrates the use of the Database.Import method and MsiDatabaseImport API ' Option Explicit
Const msiOpenDatabaseModeReadOnly = 0 Const msiOpenDatabaseModeTransact = 1 Const msiOpenDatabaseModeCreate = 3 Const ForAppending = 8 Const ForReading = 1 Const ForWriting = 2 Const TristateTrue = -1
Dim argCount:argCount = Wscript.Arguments.Count Dim iArg:iArg = 0 If (argCount < 3) Then Wscript.Echo "Windows Installer database table import utility" &_ vbNewLine & " 1st argument is the path to MSI database (installer package)" &_ vbNewLine & " 2nd argument is the path to folder containing the imported files" &_ vbNewLine & " Subseqent arguments are names of archive files to import" &_ vbNewLine & " Wildcards, such as *.idt, can be used to import multiple files" &_ vbNewLine & " Specify /c or -c anywhere before file list to create new database" Wscript.Quit 1 End If
' Connect to Windows Installer object On Error Resume Next Dim installer : Set installer = Nothing Set installer = Wscript.CreateObject("WindowsInstaller.Installer") : CheckError
Dim openMode:openMode = msiOpenDatabaseModeTransact Dim databasePath:databasePath = NextArgument Dim folder:folder = NextArgument
' Open database and process list of files Dim database, table Set database = installer.OpenDatabase(databasePath, openMode) : CheckError While iArg < argCount table = NextArgument ' Check file name for wildcard specification If (InStr(1,table,"*",vbTextCompare) <> 0) Or (InStr(1,table,"?",vbTextCompare) <> 0) Then ' Obtain list of files matching wildcard specification Dim WshShell, fileSys, file, tempFilePath Set WshShell = Wscript.CreateObject("Wscript.Shell") : CheckError tempFilePath = WshShell.ExpandEnvironmentStrings("%TEMP%") & "\dir.tmp" WshShell.Run "cmd.exe /U /c dir /b " & folder & "\" & table & ">" & tempFilePath, 0, True : CheckError Set fileSys = CreateObject("Scripting.FileSystemObject") : CheckError Set file = fileSys.OpenTextFile(tempFilePath, ForReading, False, TristateTrue) : CheckError ' Import each file in directory list Do While file.AtEndOfStream <> True table = file.ReadLine database.Import folder, table : CheckError Loop Else database.Import folder, table : CheckError End If Wend database.Commit 'commit changes if no import errors Wscript.Quit 0
Function NextArgument Dim arg, chFlag Do arg = Wscript.Arguments(iArg) iArg = iArg + 1 chFlag = AscW(arg) If (chFlag = AscW("/")) Or (chFlag = AscW("-")) Then chFlag = UCase(Right(arg, Len(arg)-1)) If chFlag = "C" Then openMode = msiOpenDatabaseModeCreate Else Wscript.Echo "Invalid option flag:", arg : Wscript.Quit 1 End If Else Exit Do End If Loop NextArgument = arg End Function
Sub CheckError Dim message, errRec If Err = 0 Then Exit Sub message = "ERROR: " & Err.Source & " " & Hex(Err) & ": " & Err.Description If Not installer Is Nothing Then Set errRec = installer.LastErrorRecord If Not errRec Is Nothing Then message = message & vbNewLine & errRec.FormatText End If Wscript.Echo message Wscript.Quit 2 End Sub
|