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:

online classes 2017-04-20 11:18

It's actually a great and helpful piece of
info. I'm happy that you just shared this useful information with us.
Please keep us informed like this. Thanks for sharing.

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

  • Donnerstag, 15 März 2018

Leave a comment

You are commenting as guest.