37414
18.03.2010, aktualisiert um 13:52:47 Uhr
9571
12
0
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:
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":
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
Gruss
Ingo
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
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
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
Gruss
Ingo
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 138563
Url: https://administrator.de/contentid/138563
Ausgedruckt am: 08.11.2024 um 06:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo imebro!
Etwa so:
Geschwindigkeitsrekorde solltest Du Dir aber nicht erwarten ...
Grüße
bastla
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%"
Grüße
bastla
Hallo imebro!
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 "
Innerhalb der Schleife wird ein "
Die um den "
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 ...
nach Deinen Vorstellungen an ...
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 "
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]
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
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
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]
Moin imebro,
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
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
Moin imebro,
na ja.... "Fehler beseitigen" ist hier vielleicht der falsche Ansatz.
Zum einen würde ich eher versuchen, die Rahmenbedingungen zu ändern.
Wie gesagt - wenn sich das Werkzeug als suboptimal zur Lösung einer Anforderung unter gegebenen Rahmenbedingungen erweist:
Grüße
Biber
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