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-Key: 138563

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

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

Member: bastla
bastla Mar 18, 2010 at 17:36:47 (UTC)
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
Mitglied: 37414
37414 Mar 19, 2010 at 08:14:35 (UTC)
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
Member: bastla
bastla Mar 19, 2010 at 15:14:15 (UTC)
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]
Mitglied: 37414
37414 Mar 22, 2010 at 10:48:48 (UTC)
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
Member: bastla
bastla Mar 22, 2010 at 11:50:18 (UTC)
Goto Top
Hallo imebro!

Ändere die Zeilen 12 und 13 auf
copy nul %UnsortiertE% >nul
copy nul %UnsortiertG% >nul
Grüße
bastla
Mitglied: 37414
37414 Mar 23, 2010 at 09:20:43 (UTC)
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
Member: bastla
bastla Mar 23, 2010 at 10:43:01 (UTC)
Goto Top
Hallo imebro!

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

Grüße
bastla
Mitglied: 37414
37414 Mar 23, 2010 at 12:33:23 (UTC)
Goto Top
ahaaaaa... jetzt klappt´s face-smile

Danke Dir bastla für Deine Mühe.

Schönen Gruß
imebro
Mitglied: 37414
37414 Mar 25, 2010 at 08:06:37 (UTC)
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
Member: Biber
Biber Mar 25, 2010 at 08:22:58 (UTC)
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
Mitglied: 37414
37414 Mar 25, 2010 at 08:50:40 (UTC)
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
Member: Biber
Biber Mar 25, 2010 at 09:20:14 (UTC)
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