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 explicit
on error resume next
Dim FS, TS, WI, DB, View, Rec, oargs, i, wshell
Dim 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.quit
End 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=0
for 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 if
next
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="&ucode
TS.Writeline "MIFVERSION=1.0.0"
TS.Writeline "MIFPUBLISHER=Company"
TS.Writeline "Name=Company_"&pname&"_"&pver
TS.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="&pcode
TS.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.