Read the fucking MSI
Um den Kollegen die Arbeit etwas zu erleichtern, kam dieses Script zustande.
Ein durch Repackaging erzeugtes MSI wird ausgelesen (Property-Table) und die gewünschten Daten werden in eine SMS-Datei (vormals PDF Package Definition File) geschrieben.
Statt "Company" kann man auch den Namen seiner Firma eintragen
Nix großes, aber die MSI-Datenbank anzuzapfen ist dann doch ganz witzig.
Hilfe kam hier von MS.
Das Script erwartet als Parameter den Dateinamen eines MSI-Files. Also am besten per Drag'n Drop das MSI auf die VBS-Datei ziehen.
Ein paar Zeilen weiter unten git es eine Angabe für das Zielverzeichnis der SMS-Datei. Entweder Sie legen das Verzeichnis analog zur Angabe unten an, oder Sie ändern hier im Script die Angabe. 
Kommentar eines Nutzers:
2017-04-20 11:18
option expliciton error resume next
Dim FS, TS, WI, DB, View, Rec, oargs, i, wshellDim proplst, result, str, pname, pver, pcode, uCode, smspfad
smspfad = "D:SMS"
set oArgs=wscript.Arguments
if oArgs.Count <1 then wscript.echo VBCRLF & "! FEHLER !" & VBCRLF & "! Fehlender Parameter !" wscript.quitEnd if
Set WI = CreateObject("WindowsInstaller.Installer")Set DB = WI.OpenDatabase(oargs(0),2)
'Füllen des Property-Arrays und deklarieren des Übergabe-Arrays''Für jedes hinzugefügte Attribut in proplst wird der Zähler in result um Eins erhöht'proplst = Array("ProductName","InstallVersion","ProductCode", "UpgradeCode")i = ubound(proplst)result = Array()
i=0for i=0 to ubound(proplst)
'SQL-Statements definieren Set View = DB.OpenView("Select `Value` From Property WHERE `Property` = '" & proplst(i) & "'")
'SQL-Statements ausführen View.Execute Set Rec = View.Fetch redim preserve result(i) result(i) = rec.StringData(1) 'Für die Variablenübergabe an das CMD' select case i case 0 pname = result(i) case 1 pver = result(i) case 2 pcode = result(i) case else ucode = result(i) end select '... und für die Stringerzeugung wegen des logfilenamens'' if not i= ubound(proplst) then' if not i+1 = ubound(proplst) then' str = str & result(i) & "_"' else' str = str & result(i)' end if
' end ifnext
Set FS = CreateObject("Scripting.FileSystemObject")Set TS = FS.CreateTextFile(smspfad & pname&"_"&pver & ".sms")wscript.echo ucode'Schreiben der SMS-Datei'TS.Writeline "[PDF]"TS.Writeline "MIFFILENAME="&left(pname,8)TS.Writeline "MIFNAME="&ucodeTS.Writeline "MIFVERSION=1.0.0"TS.Writeline "MIFPUBLISHER=Company" TS.Writeline "Name=Company_"&pname&"_"&pverTS.Writeline "Publisher=XXX"TS.Writeline "Version=XXX"TS.Writeline "Language=XXX"TS.Writeline "Programs=Install,Uninstall"
TS.Writeblanklines 1
TS.Writeline "[Install]"TS.Writeline "Name=Install"TS.Writeline "CommandLine = install.cmd /install /sms"TS.Writeline "AdminRightsRequired = True"TS.Writeline "UserInputRequired = FALSE"TS.Writeline "DriveLetterConnection = FALSE"TS.Writeline "CanRunWhen = AnyUserStatus"TS.Writeline "Run = Hidden"TS.Writeline "MSIFilePath = install"&pname&".msi"TS.Writeline "MSIProductID="&pcodeTS.Writeline "Autopublish=True"
TS.Writeblanklines 1
TS.Writeline "[UnInstall]"TS.Writeline "Name=UnInstall"TS.Writeline "CommandLine = install.cmd /uninstall /sms"TS.Writeline "AdminRightsRequired = True"TS.Writeline "UserInputRequired = FALSE"TS.Writeline "DriveLetterConnection = FALSE"TS.Writeline "CanRunWhen = AnyUserStatus"TS.Writeline "Run = Hidden"
TS.Close
wscript.quit
info. I'm happy that you just shared this useful information with us.
Please keep us informed like this. Thanks for sharing.