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.msifor /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 expliciton error resume next
Dim FS, TS, WI, DB, View, Rec, oargs, i, wshellDim proplst, result, str, pname, pver, pcode
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")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) 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&"_"&pcodewscript.echo pname & "*" & pver & "*" & pcode'TS.Close
wscript.quit