Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: imebro

imebro (Level 2) - Jetzt verbinden

18.03.2010, aktualisiert 13:52 Uhr, 6300 Aufrufe, 12 Kommentare

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

Gruss
Ingo
Mitglied: bastla
18.03.2010 um 18:36 Uhr
Hallo imebro!

Etwa so:
01.
@echo off & setlocal  
02.
set "Basis=s:\archiv" 
03.
set "Liste=D:\dir.txt" 
04.
 
05.
set "G=%temp%\Gestern.vbs" 
06.
>%G% echo WScript.Echo DateAdd("d",-1, Date) 
07.
for /f %%i in ('cscript //nologo %G%') do set "Gestern=%%i"  
08.
 
09.
>"%Liste%" echo Erstellt am: %Gestern% 
10.
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 
11.
>>"%Liste%" echo\ 
12.
>>"%Liste%" echo Geändert am: %Gestern% 
13.
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 
14.
"%Liste%"
Geschwindigkeitsrekorde solltest Du Dir aber nicht erwarten ...

Grüße
bastla
Bitte warten ..
Mitglied: imebro
19.03.2010 um 09:14 Uhr
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?

Schönen Gruß
imebro
Bitte warten ..
Mitglied: bastla
19.03.2010 um 16:14 Uhr
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:
01.
@echo off & setlocal  
02.
set "Basis=s:\archiv" 
03.
set "Liste=D:\dir.txt" 
04.
 
05.
set "G=%temp%\Gestern.vbs" 
06.
>%G% echo WScript.Echo DateAdd("d",-1, Date) 
07.
for /f %%i in ('cscript //nologo %G%') do set "Gestern=%%i"  
08.
 
09.
set UnsortiertE=%temp%\E.txt 
10.
set UnsortiertG=%temp%\G.txt 
11.
 
12.
copy nul %UnsortiertE% >nul  
13.
copy nul %UnsortiertG% >nul 
14.
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" 
15.
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" 
16.
 
17.
>"%Liste%" echo Erstellt am: %Gestern% 
18.
>>"%Liste%" sort %UnsortiertE% 
19.
>>"%Liste%" echo\ 
20.
>>"%Liste%" echo Geändert am: %Gestern% 
21.
>>"%Liste%" sort %UnsortiertG% 
22.
"%Liste%" 
23.
goto :eof 
24.
 
25.
:ProcessLine 
26.
set "Gr=               %~2" 
27.
>>%1 echo %Gr:~-15%;%~3;%~4 
28.
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]
Bitte warten ..
Mitglied: imebro
22.03.2010 um 11:48 Uhr
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
Bitte warten ..
Mitglied: bastla
22.03.2010 um 12:50 Uhr
Hallo imebro!

Ändere die Zeilen 12 und 13 auf
copy nul %UnsortiertE% >nul 
copy nul %UnsortiertG% >nul
Grüße
bastla
Bitte warten ..
Mitglied: imebro
23.03.2010 um 10:20 Uhr
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
Bitte warten ..
Mitglied: bastla
23.03.2010 um 11:43 Uhr
Hallo imebro!

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

Grüße
bastla
Bitte warten ..
Mitglied: imebro
23.03.2010 um 13:33 Uhr
ahaaaaa... jetzt klappt´s

Danke Dir bastla für Deine Mühe.

Schönen Gruß
imebro
Bitte warten ..
Mitglied: imebro
25.03.2010 um 09:06 Uhr
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
Bitte warten ..
Mitglied: Biber
25.03.2010 um 09:22 Uhr
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
Bitte warten ..
Mitglied: imebro
25.03.2010 um 09:50 Uhr
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

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
Bitte warten ..
Mitglied: Biber
25.03.2010 um 10:20 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Outlook & Mail
Outlook 2010 zeigt Übermittlungsfehler und erstellt mehrere PST-Dateien

Frage von thepatsch zum Thema Outlook & Mail ...

Batch & Shell
Dateien kopieren die nicht mehr verändert werden? (10)

Frage von pbelcl zum Thema Batch & Shell ...

Batch & Shell
gelöst Dateien in einem Verzeichnis mergen - rekursiv (10)

Frage von frad1980 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (17)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

DSL, VDSL
DSL-Signal bewerten (14)

Frage von SarekHL zum Thema DSL, VDSL ...