netmare1
Goto Top

Versionsnummer von OCX per batch auslesen und drucken

Hallo,

mmh - grade angemeldet und schon ne Frage (oder war das der Grund meiner Anmeldung?! ;))

Es geht um folgendes:

Ich kopiere und regestriere per batch ein paar ocx-Dateien per folgedem Ausdruck:

z.B.:
copy MSCAL.OCX c:\windows\system32\
regsvr32 c:\windows\system32\MSCAL.OCX
.
.
.


Ich möchte (nachdem alle ocx Dateien regestriert sind die im Batch festgelegt sind) die aktuelle Versionsnummer der regestrierten Batchdateien anzeigen lassen und ausdrucken zu Dokumentationszwecken.

Frage ist:
Wie lese ich die Versionsnummer der ocx Dateien per batch aus und zeige sie dem Benutzer an und lasse diese dann ausdrucken?

Vieleicht kann mir da jemand helfen?!
Wie gesagt: es geht NICHT um das Datum der Dateien sondern um die Version.

Hoffe mal auf Antwort.

Gruß aus dem schönen Niedersachsen ;)

Content-Key: 55738

Url: https://administrator.de/contentid/55738

Printed on: April 16, 2024 at 23:04 o'clock

Member: bastla
bastla Apr 04, 2007 at 15:31:54 (UTC)
Goto Top
Hallo NetMare1 und (ein etwas verspätetes) Willkommen im Forum!

Für das Auslesen könnte ich eine kombinierte Batch/VB-Script-Lösung anbieten:
@echo off & setlocal
set "Datei=c:\windows\system32\MSCAL.OCX"  
set "GetV=%Temp%\GetV.vbs"  
echo Set objWMIService=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")>"%GetV%"  
echo Set colFiles=objWMIService.ExecQuery ("SELECT * FROM CIM_Datafile WHERE Name='"^&Replace(WScript.Arguments(0),"\","\\")^&"'")>>"%GetV%"  
echo For Each objFile in colFiles: WScript.Echo objFile.Version: Next>>"%GetV%"  
set Version=
for /f %%i in ('cscript //nologo "%GetV%" "%Datei%"') do set "Version=%%i"  
if defined Version echo %Datei% - Version %Version%
del "%GetV%"  
Kurze Beschreibung: Das konkrete Auslesen erledigt eine temporäre VBS-Datei, die direkt im Batch erzeugt wird. An diese Script-Datei wird als Argument beim Aufruf die zu prüfende .ocx-Datei mit komplettem Pfad übergeben. Der Rückgabewert wird in der Variablen %Version% zur weiteren Verwendung gespeichert. Abschließend wird die Script-Datei gelöscht.

Die oben stehende Version ist (zum Testen) als "stand-alone"-Variante gedacht. Wenn mehrere Dateien überprüft werden sollen, könntest Du um die Zeilen "set Version=" bis "if defined ..." eine Schleife bauen, die jeweils den Dateinamen (aus einer ohnehin vorhandenen Liste?) liefert.

Dann würde es sich auch anbieten, die Ausgabe in eine Textdatei umzuleiten und diese dem Benutzer per Windows-Editor zur Ansicht bzw zum Ausdruck zur Verfügung zu stellen.

Grüße
bastla
Member: NetMare1
NetMare1 Apr 04, 2007 at 15:44:30 (UTC)
Goto Top
Hi bastla,

danke fuer das Willkommen...

...und die geniale Loesung!

Hast mir sehr geholfen!

Gruss,
NetMare

PS: geloest :D
Member: bastla
bastla Apr 04, 2007, updated at Aug 01, 2013 at 16:09:58 (UTC)
Goto Top
Hallo NetMare1!

Freut mich, wenn's hilft.

Eine Anpassung möchte ich noch vorschlagen:
for /f "delims=" %%i in ('cscript //nologo "%GetV%" "%Datei%"') do set "Version=%%i"  
sorgt dafür, dass die Versionsinfo nicht durch zB Leerstellen auseinandergerissen wird (so habe ich gerade eben beim Testen folgende Versionsnummer - einer anderen .ocx-Datei - vorgefunden: 1, 0, 0, 1).

Grüße
bastla
Member: Soidberg
Soidberg Apr 04, 2007 at 21:37:12 (UTC)
Goto Top
Sehr interessante Lösung.

Vielen Dank für diesen Beitrag, kommt mir gerade passend.

Gruß Soidberg
Member: Biber
Biber Apr 04, 2007 at 22:20:24 (UTC)
Goto Top
Der Vollständigkeit halber (auch ich würde bastla's Variante vorziehen):

Es gibt naturlich auch diverse Konsolen-Utilities, die diese Versionsnummer anzeigen koennen.
Ein paar waren im Lauf der Zeit in der M$-ResKits dabei und tragen Namen wie FileVer.exe, FVer.exe oder so ähnlich.

Die M$-FileVer.exe hätte unter Umständen noch den Charme, dass damit auch Massenverarbeitung (also rekursive Abarbeitung von Dateien und Unterverzeichnissen) machbar ist und das zweifelhafte "Zusatzfeature", dass eine (erlaubte) nicht-konforme Versionsnummer wie von bastla gepostet automatisch geradegezogen wird.
Beispiel (die Datei GetOCXVersion.bat ist bastla's Skript, nur mit Inputparameter %1):
>for %i in (c:\windows\system32\t*.ocx) do @f:\Administrator\GetOCXVersion.bat %i
c:\windows\system32\tabctl32.ocx - Version 6.00.9043
c:\windows\system32\tdc.ocx - Version 1, 3, 0, 3130

>FileVer -bad c:\windows\system32\t*.ocx
W32i   DLL ENU       6.0.90.43 shp c:\windows\system32\tabctl32.ocx
W32i   DLL ENU      <b>1.3.0.3130</b> shp c:\windows\system32\tdc.ocx

"Zweifelhaft" also deshalb, weil man/frau offensichtlich SEHR aufpassen muss, wenn eine Versionsnummer ermittelt wird.
Je nach (M$-)Tool kann "1.3.0.3130" ODER "1, 3, 0, 3130" zurueckgegeben werden.

Gruss
Biber
Member: Biber
Biber Apr 05, 2007 at 16:19:29 (UTC)
Goto Top
wenn bastla schon solche Steilvorlagen liefert, dann sollen alle etwas davon haben...

::--- snipp GetFileVer.Bat -- von Biber modifizierter bastla-Schnipsel
@echo off & setlocal
If "%*"=="" (echo Syntax: %~n0 [Lw:\Pfad\] Dateiname ^(Wildcards erlaubt^) &&  goto :eof)  
set "GetV=%Temp%\GetV.vbs"  
echo Set objWMIService=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")>"%GetV%"  
echo Set colFiles=objWMIService.ExecQuery ("SELECT * FROM CIM_Datafile WHERE Name='"^&Replace(WScript.Arguments(0),"\","\\")^&"'")>>"%GetV%"  
echo For Each objFile in colFiles: WScript.Echo Replace(Replace(objFile.Version,",",".")," ",""): Next>>"%GetV%"  
For %%i in (%*) do call :getVers "%%i"  
del "%GetV%"  & goto :eof  
:getvers
set "Version=" & for /f %%i in ('cscript //nologo "%GetV%" "%~1"') do set "Version=%%i"  
if defined Version echo %~1 - Version %Version%
::---snapp GetFileVer.bat

In Aktion:
>f:\administrator\GetFileVer.bat %windir%\system32\t*.ocx %windir%\system32\cs*.exe
C:\WINDOWS\system32\tabctl32.ocx - Version 6.00.9043
C:\WINDOWS\system32\tdc.ocx - Version 1.3.0.3130
C:\WINDOWS\system32\cscript.exe - Version 5.6.0.8820
C:\WINDOWS\system32\csrss.exe - Version 5.1.2600.2180(xpsp_sp2_rtm.040803-2158)

Frohe Ostern
Biber