37414
Goto Top

Auflistung aller Dateien aus einem Verzeichnis, die gestern erstellt oder verändert wurden

Hallo,

ich möchte gerne alle Dateien aus einem Verzeichnis inkl. der Unterverzeichnisse auflisten lassen, die am Vortag erstellt bzw. verändert wurden.
Die Liste soll dann in eine TXT-Datei geschrieben werden.

In der TXT-Datei soll der Datei-Pfad, das Erstellungsdatum und die Größe jeder Datei ausgegeben werden.

Bisher habe ich es so versucht - mit einem "Trick" über den Befehl XCOPY:

@echo off
set jahr=%date:~-4%
set monat=%date:~-7,2%
set /a tag=%date:~-10,2%-1

xcopy /D:%monat%-%tag%-%jahr% /L /S S:\archiv\*.* > d:\1.txt

start d:\1.txt

So wird jedoch nur der Dateipfad inkl. Dateiname aufgelistet. Ich benötige aber auch die Größe der einzelnen Dateien

Ein weiterer Versuch mit dem Befehl "DIR":

@echo off
dir /s /o:s /t:w s:\archiv\*.* > d:\dir.txt

start d:\dir.txt

Hiermit werden zwar Datum, Zeit, Größe und Pfad aufgelistet... aber ich weiß nicht, wie man hierbei nur die veränderten oder neuen Dateien vom Vortag auflisten läßt.

Bin gespannt auf Eure Vorschläge face-smile

Gruss
Ingo

Content-ID: 138563

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

Ausgedruckt am: 22.11.2024 um 17:11 Uhr

bastla
bastla 18.03.2010 um 18:36:47 Uhr
Goto Top
Hallo imebro!

Etwa so:
@echo off & setlocal 
set "Basis=s:\archiv"  
set "Liste=D:\dir.txt"  

set "G=%temp%\Gestern.vbs"  
>%G% echo WScript.Echo DateAdd("d",-1, Date)  
for /f %%i in ('cscript //nologo %G%') do set "Gestern=%%i"   

>"%Liste%" echo Erstellt am: %Gestern%  
for /r "%Basis%" %%i in (.) do for /f "tokens=1-3*" %%a in ('dir /a-d /tc "%%i" 2^>nul^|findstr /b "%Gestern%"') do >>"%Liste%" echo %%~fi\%%~nxd;%%~a %%~b;%%c  
>>"%Liste%" echo\  
>>"%Liste%" echo Geändert am: %Gestern%  
for /r "%Basis%" %%i in (.) do for /f "tokens=1-3*" %%a in ('dir /a-d "%%i" 2^>nul^|findstr /b "%Gestern%"') do findstr /c:"%%~fi\\%%~nxd" "%Liste%">nul || >>"%Liste%" echo %%~fi\%%~nxd;%%~a %%~b;%%c  
"%Liste%"  
Geschwindigkeitsrekorde solltest Du Dir aber nicht erwarten ... face-wink

Grüße
bastla
37414
37414 19.03.2010 um 09:14:35 Uhr
Goto Top
Hallo Bastla,

vielen Dank für Deine Mühe.
Zwar verstehe ich 90% des Inhaltes leider nicht... aber ich habe es eben getestet.

Funktioniert recht gut und zeigt alle Infos an.
Wäre nur schön, wenn z.B. die einzelnen Angaben (Größe etc.) etwas voneinander getrennt angezeigt würden.
Und... wenn das ganze dann auch nach der Dateigröße sortiert werden könnte innerhalb "erstellt am" und "geändert am".

Hast da noch eine Idee? face-wink

Schönen Gruß
imebro
bastla
bastla 19.03.2010 um 16:14:15 Uhr
Goto Top
Hallo imebro!

Zwar verstehe ich 90% des Inhaltes leider nicht...
In der Kurzfassung:
Nachdem per eingebettetem VBScript die Berechnung des gestrigen Datums auf etwas weniger wackelige Beine gestellt (und dieses Datum in der Variablen %Gestern% gespeichert) wurde, geht die "for /r"-Schleife, ausgehend von %Basis%, jeden (Unter-)Ordner einzeln durch.

Innerhalb der Schleife wird ein "dir"-Befehl (mit Ausschluss von Ordnern und jeweils benötigter Datumsangabe) ausgeführt und gefiltert, sodass nur noch Zeilen (= Dateien) mit dem Datum lt %Gestern% erhalten bleiben.

Die um den "dir"-Befehl gewickelte "for /f"-Schleife zerlegt schließlich die Ausgabe, sodass Datum (%%a), Uhrezit (%%b), Größe (%%c) und Dateiname (%%d) getrennt zur Verfügung stehen. Die beim Zusammensetzen des Pfades (der Ordner befindet sich in %%i) verwendete Schreibweise "%%~nxd" für den Dateinamen wäre hier gar nicht erforderlich (stammt noch von einer alternativen Variante) und ließe sich auf %%d verkürzen.

Schließlich wird für die gestern geänderten Dateien noch geprüft, ob sie bereits (als "erstellt") in der Liste aufscheinen und daher nicht nochmals angeführt werden müssen ...

Wäre nur schön, wenn z.B. die einzelnen Angaben (Größe etc.) etwas voneinander getrennt angezeigt würden.
Passe einfach in den Zeilen 10 und 13 (zweimal; beim ersten Mal den "\" zwischen Pfad und Dateinamen doppelt!) die entsprechenden Ausgaben
... %%~fi\%%~nxd;%%~a %%~b;%%c
nach Deinen Vorstellungen an ...
Und... wenn das ganze dann auch nach der Dateigröße sortiert werden könnte innerhalb "erstellt am" und "geändert am".
Das könnte (ungetestet) etwa so gehen:
@echo off & setlocal 
set "Basis=s:\archiv"  
set "Liste=D:\dir.txt"  

set "G=%temp%\Gestern.vbs"  
>%G% echo WScript.Echo DateAdd("d",-1, Date)  
for /f %%i in ('cscript //nologo %G%') do set "Gestern=%%i"   

set UnsortiertE=%temp%\E.txt
set UnsortiertG=%temp%\G.txt

copy nul %UnsortiertE% >nul 
copy nul %UnsortiertG% >nul
for /r "%Basis%" %%i in (.) do for /f "tokens=1-3*" %%a in ('dir /a-d /tc "%%i" 2^>nul^|findstr /b "%Gestern%"') do call :ProcessLine "%UnsortiertE%" "%%c" "%%a %%b" "%%~fi\%%d"  
for /r "%Basis%" %%i in (.) do for /f "tokens=1-3*" %%a in ('dir /a-d "%%i" 2^>nul^|findstr /b "%Gestern%"') do findstr /c:"%%c;%%a %%b;%%~fi\\%%d" "%UnsortiertE%">nul || call :ProcessLine "%UnsortiertG%" "%%c" "%%a %%b" "%%~fi\%%d"  

>"%Liste%" echo Erstellt am: %Gestern%  
>>"%Liste%" sort %UnsortiertE%  
>>"%Liste%" echo\  
>>"%Liste%" echo Geändert am: %Gestern%  
>>"%Liste%" sort %UnsortiertG%  
"%Liste%"  
goto :eof

:ProcessLine
set "Gr=               %~2"  
>>%1 echo %Gr:~-15%;%~3;%~4
goto :eof
Wenn in der endgültigen Ausgabe die Größe wieder am Zeilenende aufscheinen soll (was ich allerdings ohnehin nicht sehr übersichlich finde), müssten die Temporär-Dateien (%UnsortiertX%) dann nicht nur sortiert, sondern auch nochmals per "for /f"-Schleife zerlegt und neu zusammengesetzt werden. (Noch als Anmerkung dazu: Das verwendete Trennzeichen ";" war eigentlich dazu gedacht, einen einfachen Import in zB Excel zu ermöglichen.)

Grüße
bastla

[Edit] Fehlende Anführungszeichen in den Zeilen 14 und 15 ergänzt und Zeilen 12 und 13 wie unten angeführt geändert [/Edit]
37414
37414 22.03.2010 um 11:48:48 Uhr
Goto Top
Hallo Bastla und vielen Dank für Deine weitere Mühe.

Ich habe Deinen Vorschlag eben mal getestet (den letzten mit den 28 Zeilen).
Leider erhielt ich eine Fehlermeldung im DOS-Fenster.

"Findstr: C:\Dokume1~\Ingo-M1~\Lokale1~\Temp\E.txt kann nicht geöffnet werden."

Diese Zeile steht im DOS-Fenster 8 Mal untereinander... weiter passierte nichts.

Hast Du eine Idee?

Danke und Gruß
imebro
bastla
bastla 22.03.2010 um 12:50:18 Uhr
Goto Top
Hallo imebro!

Ändere die Zeilen 12 und 13 auf
copy nul %UnsortiertE% >nul
copy nul %UnsortiertG% >nul
Grüße
bastla
37414
37414 23.03.2010 um 10:20:43 Uhr
Goto Top
Hallo Bastla,

hmmm... irgend was funktioniert da nicht.

Das gestrige und auch heutige Ergebnis in der Datei "dir.txt" ist folgendes (nachdem ich die o.g. Änderungen gemacht habe):

Erstellt am: 22.03.2010

Geändert am: 22.03.2010

Es wurden jedoch definitiv Änderungen im Verzeichnis vorgenommen!!

Gruss
imebro
bastla
bastla 23.03.2010 um 11:43:01 Uhr
Goto Top
Hallo imebro!

Mit den inzwischen hinzugefügten Anführungszeichen in den Zeilen 14 und 15 sollte das besser gehen ...

Grüße
bastla
37414
37414 23.03.2010 um 13:33:23 Uhr
Goto Top
ahaaaaa... jetzt klappt´s face-smile

Danke Dir bastla für Deine Mühe.

Schönen Gruß
imebro
37414
37414 25.03.2010 um 09:06:37 Uhr
Goto Top
Hi Bastla,

hat zwar geklappt... aber ich habe heute mal - bevor ich das DOS-Fenster geschlossen habe - dort rein geschaut.

Da befinden sich 2 Fehlermeldungen (die zweite 3 x untereinander):

Der Befehl "r" ist entweder falsch geschrieben oder konnte nicht gefunden werden

Findstr: Suchzeichenfolge zu lang
Findstr: Suchzeichenfolge zu lang
Findstr: Suchzeichenfolge zu lang

Hast Du dafür noch eine Erklärung?

Und... wo wir schon dabei sind...

Wäre es möglich, die Größenangaben, die ja jeweils am Anfang stehen, in MB anzugeben, anstatt in KB und vielleicht dann den Begriff "MB" oder "Megabyte" dazu zu schreiben?

Danke Dir!
imebro
Biber
Biber 25.03.2010 um 09:22:58 Uhr
Goto Top
Moin imebro,

Der Befehl "r" ist entweder falsch geschrieben oder konnte nicht gefunden werden
Dann wird vermutlich ein Verzeichnis angesprochen, das ein Ampersand ("&") enthält und dieser Verzeichnisname fehlinterpretiert als "mach was mit Vezeichnisname UND führe folgenden Befehl aus".
Findstr: Suchzeichenfolge zu lang
Bei der FindStr /C:-Option ist die Länge des Suchstrings auf maximal 128 Zeichen beschränkt.
Deine Länge (Unterverzeichnisnamen +Datumsangabe) liegt offensichtlich darüber.

P.S. hatte ich schon mal irgendwo erwähnt, dass Batch eigentlich ungeeignet ist für Datums-Arithmetik und das dieses lieber Skriptsprachen machen sollten, die etwas davon verstehen?

Grüße
Biber
37414
37414 25.03.2010 um 09:50:40 Uhr
Goto Top
Hallo Biber,

danke für Dein Posting...

Bastla hatte mir ja geholfen... leider weiß ich jetzt nicht, wie ich die Fehler beheben kann.
Grundsätzlich funktioniert alles ja gut - trotz Datums-Arithmetik face-smile

Weiter oben steht ja der Code... vielleicht kannst Du mir ja direkt helfen, die Fehler zu beseitigen?

Mit Batch kenne ich mich ja wenigstens ETWAS aus... aber mit Scripts gar nicht.
Hast denn nen Vorschlag, wie ich das per Script lösen kann?

Danke und Gruß
imebro
Biber
Biber 25.03.2010 um 10:20:14 Uhr
Goto Top
Moin imebro,

na ja.... "Fehler beseitigen" ist hier vielleicht der falsche Ansatz.

Zum einen würde ich eher versuchen, die Rahmenbedingungen zu ändern.
  • Wenn es Verzeichnis- oder Dateinamen mit darin enthaltenem "&" gibt - ja hey! das wird immer Probleme machen. Das würde ich ausmerzen.
  • Wenn es in deinem s:\Archiv-Share Verzeichnis/Dateinamen gibt, die länger als 110 Zeichen sind - okay... auch das ist hausgemachtes Leiden. Dann schau dir die drei Fälle an, ob die wirklich einen kompletten Limerick im Namen tragen müssen und mach ggf. einen kürzeren, trockeneren Gag draus.
  • Wenn das nicht geht/nicht sein soll: dann must du eben rekursiv durch die Verzeichnisse - jeweils ins Unterverzeichnis und dort die Dateien abgrasen (dann entfällt die Länge der Unterverzeichnisnamens im FindStr-Suchstring

  • Oder aber - du löst die eigentliche Aufgabe - das Finden aller Dateien von gestern - über ein One-trick-Tool, das auf so etwas spezialisiert ist. Zum Beispiel Horst Schaeffers DelAge32 mit Schalter /PreView oder auch WasFile sollte man/frau dazu benutzen können. Auch die PowerShell kann besser mit Datums-Arithmetik umgehen. oder ein kleiner rekursiver VBS-Schnipsel, der alle Dateien von gestern rausflöht.

Wie gesagt - wenn sich das Werkzeug als suboptimal zur Lösung einer Anforderung unter gegebenen Rahmenbedingungen erweist:
  • nimm ein anderes Werkzeug
  • überprüfe die Anforderung
  • ändere die Rahmenbedingungen

Grüße
Biber