Read the fucking MSI (Part II)
Die gleiche Routine wie bei "MSI auslesen", aber hier erfolgt die Datenübergabe an %comspec% per wscript.echo.
Batches können in dieser Konstellation drei Parameter abgreifen.
Nämlich so :
set MSI-Datei = lalala.msi
for /f "delims=* tokens=1-3" %%a in ('cscript //nologo "%~dp0Data\setenv2.vbs" "%~dp0install\%MSI-Datei%"') do (
set Produktname=%%a
set Installversion=%%b
set MSIGUID=%%c
)
Der scharfäugige Beobachter sieht natürlich sofort, dass die VBS.Datei aus einer CMD heraus aufgerufen wird und vom VBS ausgelesene Werte einer MSI-Datei zurückgibt.
option explicit
on error resume next
Dim FS, TS, WI, DB, View, Rec, oargs, i, wshell
Dim proplst, result, str, pname, pver, pcode
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")
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)
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("c:\Logs\MSI\" & str & ".txt")
'TS.Write pname&"_"&pver&"_"&pcode
wscript.echo pname & "*" & pver & "*" & pcode
'TS.Close
wscript.quit