viprex
Goto Top

Versionsnummer, Datum, Filename auslesen

Guten Tag,

ich habe folgende Problemstellung zu lösen: In einem Ordner auf einem Server liegen sehr viele .exe Dateien. Diese .exe Dateien sollen jetzt mit ihrer Versionnummer, ihrem Datum (wobei ich noch klären muss, welches Datum gemeint ist) und ihrem Namen (ohen Pfad und Dateiendung) aufgelistet werden, sodass diese in Excel weiterverabeitet werden können.
Meine Kenntnisse in Batch sind bescheiden, in VBS habe ich gar keinen Plan.

Zur Verfügung steht mir alles, was ich brauche. Tools, OS etc. sind also egal. Schön wäre es, wenn ich WinXP mit Boardmitteln nutzen könnte.

Meine Lösung sieht so aus. Sie funktioniert und gibt mir lauter Zeilen des Schemas ABCD;TT.MM.JJJJ;VERS aus. Das sieht eigentlich ganz gut aus.

- Den VBS Teil in Zeile 6,7,8 habe ich gar nicht verstanden. Diese Zeilen sind Teil eines Codes, den ich hier bei administrator.de gefunden habe (ich glaube bearbeitet durch Biber und Bastla - vielen Dank dafür!)
- Die Zeile 13 verstehe ich auch nicht (besser gesagt das 'cscript //nologo "%GetV%" "%~1"') - ebenfalls ein kopierter Abschnitt des Codes von Biber und Bastla.
- Die Zeile 15 gibt mir ein Dateidatum aus (durch das %%~tj).
- Das Datum gibt mir auch die Uhrzeit dazu aus. Daher habe ich in Zeile 18 einfach die letzten 7 Zeichen des Strings abgeschnitten.
- Das Problem mit dem Dateinamen habe ich in Zeile 20,21,22 gelöst, indem ich einfach fest die ersten 3 und die letzten 4 Zeichen abschneide. Das ist natürlich höchst statisch (doof).

Jetzt meine Frage:
Wie muss ich dieses Script anpassen, damit es 1. auch mit beliebigen Pfaden funktioniert und 2. mir auch die anderen Datum der Datei ausgibt?

@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 :getSpecs "%%i"   
del "%GetV%"  & goto :eof  

:getSpecs
set "Version=" & for /f %%i in ('cscript //nologo "%GetV%" "%~1"') do set "Version=%%i"   

for /f "delims=" %%j in ('dir %1 /s /b /a-d') do set filedate=%%~tj   

set filedate=%filedate:~0,-7%

set filename=%~1
set filename=%filename:~0,-4%
set filename=%filename:~3%

if defined Version echo %filename%;%filedate%;%Version% >> c:\version.log


Dies ist kein dringliches Problem, ich kann mit dem Skript ja händisch das Ziel erreichen. Dennoch würde ich mich freuen, wenn Verbesserungsvorschläge kommen, insbesondere bzgl. des Datums. Herzlichen Dank!

Content-Key: 120604

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

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

Member: miniversum
miniversum Jul 16, 2009 at 16:39:43 (UTC)
Goto Top
Zeile 20 bis 22 kannst du so zusammenfassen:
set filename=%~n1
Das mit dem Datum kannst du so aufdröseln:
Erstellung:
for /f "delims=" %%j in ('dir %1 /s /b /a-d /tc') do set filedate=%%~tj
Letzter Zugriff:
for /f "delims=" %%j in ('dir %1 /s /b /a-d /ta') do set filedate=%%~tj
Letzter Schreibzugriff:
for /f "delims=" %%j in ('dir %1 /s /b /a-d /tW') do set filedate=%%~tj
Member: Viprex
Viprex Jul 20, 2009 at 07:42:43 (UTC)
Goto Top
Herzlichen Dank für deine Antwort!

Zitat von @miniversum:
Zeile 20 bis 22 kannst du so zusammenfassen:
> set filename=%~n1
Sehr geil. Magst du mir erzählen, wo ich diese Information finden kann? In der Hilfe von set /? Ich stehe immer wie blöde da und frage mich, wo ich sowas finden soll.

Das mit dem Datum kannst du so aufdröseln:
Erstellung:
> for /f "delims=" %%j in ('dir %1 /s /b /a-d
/tc') do set filedate=%%~tj
Letzter Zugriff:
> for /f "delims=" %%j in ('dir %1 /s /b /a-d
/ta') do set filedate=%%~tj
Letzter Schreibzugriff:
> for /f "delims=" %%j in ('dir %1 /s /b /a-d
/tW') do set filedate=%%~tj
Funktioniert das bei dir? Ich bekomme bei allen 3 Zeilen das Erstellungsdatum ausgegeben? Wo habe ich den Fehler?


@echo off & setlocal 

::Falls Aufruf der Batch ohne Parameter, Hinweis, wie die Batch korrekt in der Konsole aufzurufen ist
If "%*"=="" (echo Syntax: %~n0 [Lw:\Pfad\] Dateiname ^(Wildcards erlaubt^) &&  goto :eof)   
:: Pfad von der Konsole abgreifen
set "GetV=%Temp%\GetV.vbs"   

:: VBS Teil - Script von Bastla und Biber
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%"   

:: Für jede Datei die Eigenschaften auslesen und wegloggen
For %%i in (%*) do call :getSpecs "%%i"   
:: End of Script
del "%GetV%"  & goto :eof  

:: Eigenschaften der Datei auslesen
:getSpecs

::Versionnummer
set "Version=" & for /f %%i in ('cscript //nologo "%GetV%" "%~1"') do set "Version=%%i"   
::Erstellung
for /f "delims=" %%j in ('dir %1 /s /b /a-d /tc') do set filedate1=%%~tj  
::Letzter Zugriff
for /f "delims=" %%k in ('dir %1 /s /b /a-d /ta') do set filedate2=%%~tk  
::Letzter Schreibzugriff
for /f "delims=" %%l in ('dir %1 /s /b /a-d /tW') do set filedate3=%%~tl  
:: Dateinameohne Pfad und Endung
set filename=%~n1

::Log schreiben: Datei;Erstellungsdatum;Letzter_Zugriff;Letzter_Schreibzugriff;Versionsnummer
if defined Version echo %filename%;%filedate1%;%filedate2%;%filedate3%;%Version% >> c:\version_mitZeit.log
Member: miniversum
miniversum Jul 20, 2009 at 10:47:23 (UTC)
Goto Top
Das steht nicht in der hilfe zum set sondern zu for (for /?) ziemlich am ende beschreiben.

Das war von mir ungetestet.
So sollte es auf jeden fall gehen:
set "filedate1="  
set "filedate2="  
set "filedate3="  
for /f "skip=5 delims= " %%j in ('dir "%~1" /tc') do if not defined filedate1 set filedate1=%%j  
for /f "skip=5 delims= " %%j in ('dir "%~1" /ta') do if not defined filedate2 set filedate2=%%j  
for /f "skip=5 delims= " %%j in ('dir "%~1" /tw') do if not defined filedate3 set filedate3=%%j  
bzw. wenn du nicht nur Datum sondern auch die Uhrzeit dazu willst dann:
set "filedate1="  
set "filedate2="  
set "filedate3="  
for /f "skip=5 tokens= 1,2 delims= " %%j in ('dir "%~1" /tc') do if not defined filedate1 set filedate1=%%j %%k  
for /f "skip=5 tokens= 1,2 delims= " %%j in ('dir "%~1" /ta') do if not defined filedate2 set filedate2=%%j %%k  
for /f "skip=5 tokens= 1,2 delims= " %%j in ('dir "%~1" /tw') do if not defined filedate3 set filedate3=%%j %%k  
Member: Viprex
Viprex Jul 20, 2009 at 10:58:32 (UTC)
Goto Top
Perfekt. Vielen lieben Dank für die tolle Hilfe! Klappt wunderbar. Pfade sind jetzt kein Problem mehr und auch die Dateieigenschaften bekomme ich, wie gewünscht. Klasse. Immer wieder großartig, wie hier geholfen wird. Danke!