47674
Goto Top

VB Script - Dateieigenschaften in Logfile schreiben

Per VBS Dateiname, Zugriffsdatum, Erstelldatum, Änderungsdatum und Dateiname auslesen und in ein Log-File schreiben.

Hallo zusammen,

folgende "Problem":

in einer Windows Ordnerstruktur, das heißt Ordner und mehrere Ebenen von Unterordnern, sind Dateien gespeichert.
Von allen Dateien in dieser sollen mehrere Eigenschaften ausgelesen werden und in jeweils eine Zeile eines Log-Files geschrieben werden:

<Dateiname> <CreationDate> <LastAccessDate> <LastModifiedDate> <FileSize>

Bei jedem ausführen des Scripts soll über den oben genannten Dateieigenschaften eine Zeile mit dem aktuellen Datum eingefügt werden.

Da ich das ganze als nicht in einfachem Batch umsetzbar sehe, habe ich mich für VBS entschieden. Mein Problem: Ich habe keine Ahnung davon! Habe mir per Copy & Paste das ein oder andere zusammen gebastelt, aber funktionieren tut das in keinster Weise.

Kann mir jemand weiterhelfen? Vielleicht gibt es ja ein fertiges Skript, das ich nur noch etwas modifizieren muss...

Vielen Dank und Gruß
daedalus

Content-Key: 107119

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

Printed on: April 19, 2024 at 02:04 o'clock

Member: bastla
bastla Jan 26, 2009 at 13:37:28 (UTC)
Goto Top
Hallo daedalus!

Wie definierst Du denn "einfachen Batch"? Fiele folgendes nicht mehr darunter?
@echo off & setlocal
set "Pfad=D:\DeinPfad"  
set "Log=D:\Log.txt"  

>>"%Log%" echo %date%  
for /f "delims=" %%i in ('dir /s /b /a-d "%Pfad%"') do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
set "FileName=%~nx1"  
set "FileSize=%~z1"  
set "LastModifiedDate=%~t1"  
for /f "tokens=1,2" %%a in ('dir /tc %1^|findstr /c:"%FileName%"') do set "CreationDate=%%a %%b"  
for /f "tokens=1,2" %%a in ('dir /ta %1^|findstr /c:"%FileName%"') do set "LastAccessDate=%%a %%b"  
>>"%Log%" echo %FileName%;%CreationDate%;%LastAccessDate%;%LastModifiedDate%;%FileSize%  
goto :eof
Falls es tatsächlich ein VBScript werden soll, bitte Deinen derzeitigen Stand posten ...

Grüße
bastla
Member: Biber
Biber Jan 26, 2009 at 14:26:24 (UTC)
Goto Top
Moin daedalus,
Moin bastla,

<OT>
ich hätte für diesen "Plan" oder dieses "Konzept" weder eine Zeile Batch noch VBSkript spendiert.
Was soll das denn - bei 100.000 Dateien auf dem untersuchten Dateipfad werden am ersten Tag 100.001 Logzeilen weggemüllt, am 2 Tag auch 100.001 Zeilen, ebenso an 3., 4. usw bis zum n-1ten Tag, an dem die Festplatte langsam Unwucht bekommt.

Geschrieben wird immer der gleiche Umfang, egal ob sich 78% der Daten ändern oder gerade 4 Wochen Werksurlaub sind.

--> Das ist kein Plan.

Vielleicht sollten wir mal eine kleine Diskussion anstossen im Bereich "Entwicklung" zum Thema:
"Könnte es Unterschiede geben zwischen
  • dem automatisierten Mit-Schreiben von Daten,
  • dem Sammeln von Informationen,
  • dem Aufbau von Wissen und
  • dem Fernziel, dem Streben nach Weisheit?"


Manche Montage denke ich schon, es wäre an der Zeit dafür.....
</OT>

Grüße
Biber
Mitglied: 47674
47674 Jan 26, 2009 at 14:30:31 (UTC)
Goto Top
Ok.... Ich habe keinen Weg gefunden, das per Batch umzusetzten. Ich dachte nicht, dass sowas mit Batch möglich ist...

Aber erst mal Danke, es funktioniert!!!

Jetzt habe ich aber noch einige Fragen, denn ich möchte ja auch was dabei lernen... face-smile
A: ) Ist goto:eof nicht mit exit gleich zusetzten? Damit wir doch nur ans Ende der Datei geprungen, oder?
B: ) Was hat es mit %~nx1, %~z1 und %~t1 auf sich?
C: ) Die Befehle, mit denen du Creation- und LastAccessDate ausliest verstehe ich garnicht...
D: ) Was haben zwei Prozenteichen vor einer Variablen zu bedeuten?

Danke und Gruß
daedalus

@Biber:
Danke, dass du dir Sorgen machst, aber ich kann dir versicher, die Logfiles erleichtern einiges...
Member: bastla
bastla Jan 26, 2009 at 14:43:21 (UTC)
Goto Top
Hallo daedalus!

zu A: ) "goto :eof" beendet den Batch, schließt aber nicht die CMD-Shell; in der Zeile 16 (dort hat es eigentlich die Funktion "return from subroutine" ) wär's eigentlich nur nötig, falls Du noch weitere Unterprogramme oder sonstige Batchzeilen unterhalb einfügen wolltest (dient also als Vorsichtsmaßnahme) ...

zu B: ) Kannst Du unter "for /?" (ziemlich am Ende; dort für die Schleifen-Laufvariable %I gezeigt) nachlesen ...

zu C: ) Wenn Du in einer CMD-Shell
dir /tc Datei
eingibst, sollte zu erkennen sein, was in der Schleife gemacht wird (siehe auch "dir /?") - das "findstr" reduziert nur die Ausgabe auf die eine relevante Zeile mit dem Dateinamen (und dem Timestamp) ...

zu D: ) Dass diese Variable als Laufvariable einer "for"-Schleife in einem Batch verwendet wird - bei Eingabe direkt an der Kommandozeile ist nur ein Prozentzeichen erforderlich.

Grüße
bastla
Mitglied: 47674
47674 Jan 27, 2009 at 07:10:26 (UTC)
Goto Top
Ok, danke für die Hilfe! :D
Mitglied: 47674
47674 Jan 28, 2009 at 09:44:54 (UTC)
Goto Top
Ok, ich brauche noch mal Hilfe.

Folgende Änderungen sollen noch ins Skript aufgenommen werden und ich weiß nicht wie:
A: Nicht nur Ausgabe des Dateinamens, sondern der relative Pfad in bezug auf das Verzeichnis, bei dem die Suche nach Dateien startet.
B: Nur Dateien mit der Endung *.Lab auflisten.

Kann mir jemand helfen?
Member: Biber
Biber Jan 28, 2009 at 10:15:56 (UTC)
Goto Top
Moin daedalus,

die Änderung B, also das Reduzieren auf alle *.lab-Dateien solltest Du selber hinbekommen, wenn Du @bastlas Lesetipps gefolgt bist.
Aus [...'dir /s /b /a-d "%Pfad%"' ..] nun ein [...'dir /s /b /a-d "%Pfad%\*.lab"'...] zu machen, sollte lösbar sein.

Für die Teilfrage A: Poste doch bitte den jetzigen Stand des von Dir angepassten Schnipsels.

Danke
Biber
Mitglied: 47674
47674 Jan 28, 2009 at 13:27:56 (UTC)
Goto Top
Derzeit sieht das Skript so aus:
@echo off & setlocal
set "listPath=%cd%"  
set "Log=%cd%\label_file_list.log"  
>"%Log%" echo CurrentDate	CreationDate	LastAccessDate	LastModifiedDate	FileSize	FileName  
for /f "delims=" %%i in ('dir /s /b /a-d "%listPath%\*.lab"') do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
	set "FileName=%~nx1"  
	set "FileSize=%~z1"  
	set "LastModifiedDate=%~t1"  
	for /f "tokens=1,2" %%a in ('dir /tc %1^|findstr /c:"%FileName%"') do set "CreationDate=%%a %%b"  
	for /f "tokens=1,2" %%a in ('dir /ta %1^|findstr /c:"%FileName%"') do set "LastAccessDate=%%a %%b"  
		>>"%Log%" echo %date%	%CreationDate%	%LastAccessDate%	%LastModifiedDate%	%FileSize%	%FileName%  
	goto :eof
Member: bastla
bastla Jan 28, 2009 at 14:29:42 (UTC)
Goto Top
Hallo daedalus!

Füge ab Zeile 9 ein
set "FullPath=%~f1"
call set "RelPath=%%FullPath:%listPath%\=%%
Danach steht %RelPath% zur Verfügung.

Grüße
bastla