Running chained MSI installations

Anyone who has tried to run two Windows Installer-based installations at the same time knows that you can't do this. Only one MSI-based installation can run at a time. So what if you need to run multiple MSI packages one after the other? There is an easy solution to this using vbscript.

Consider the following code:

' ===================================================================== 

Option Explicit

runit()

sub runit()

Dim ret, oInstaller

Set oInstaller = CreateObject("WindowsInstaller.Installer")

ret = oInstaller.InstallProduct("c:\Testsetupfiles\testsetup1.msi", "")

ret = oInstaller.InstallProduct("c:\Testsetupfiles\testsetup2.msi", "")

ret = oInstaller.InstallProduct("c:\Testsetupfiles\testsetup3.msi", "")

end sub
' ==========================================================================

What we're doing here is simple. We create variables ret and oInstaller and then set oInstaller to an instance of a Windows Installer object. Then we use the WindowsInstaller.InstallProduct method to call the installations. Since we have three lines of code here making the call, we're running three different installations as you can see by the different file names. The last two lines beginning with "ret =" wait until the line above it has run completely to start the installation. This script allows you to specify a local directory where your MSI file resides or you can specify a UNC path such as \\ServerName\ServerShare\MSIName

You can also expand on the above code to run the installations of all MSI files in a shared folder on the client machine. Consider the following:

' ==========================================================================

Option Explicit

runit()

sub runit()
 On Error resume next
 dim FSO, ret, oInstaller
 dim fn, f, fc

 Set FSO = CreateObject("Scripting.FileSystemObject")
 Set oInstaller = CreateObject("WindowsInstaller.Installer")

 set f = fso.getfolder("C:\Testsetupfiles")
 set fc = f.files

 for each fn in fc
  ret = oInstaller.InstallProduct(f & "\" & fn.name & "", "")
 Next

end sub

' ==========================================================================

Though it looks more complex, it really isn't. We're setting instances of the File System Object (FSO) and Windows Installer (oInstaller) and declaring variables we'll need to ennumerate the files in the target directory.
We set f equal to our target folder C:\TestSetupFiles. Again, this can be substituted for a UNC path to a share on the network. Then we set fc to all of the files in our directory (f). Finally, by using a for each loop we cycle through all of the files (fc), setting the currently cycled file to fn and then call the WindowsInstaller.InstallProduct method to run the installation. In this line of code

ret = oInstaller.InstallProduct(f & "\" & fn.name & "", "")

we're parsing the directory f, adding a backslash and then ending with the filename (fn.name). This will work for all MSI files in a given directory. I added the On Error Resume Next line in the code because it's possible you will have more than just MSI files in the specified folder and obviously you can't install a .TXT file.