Nur Ordner kopieren, die Dateien enthalten junger als...
Hallo Leute,
ich versuche diesen Ablauf per Batch zu lösen, kriege es aber nicht hin. Kann mir jemand vielleicht helfen?
Ausgangsituation:
In einem Ordner sind mehrere Ordner enthalten. (Sie haben alle einen Namensmuster, z.B. "deploy_...")
Ziel:
Von diesen Ordner nur diejenigen zu kopieren (komplett, mit dem gesammten Inhalt und Struktur), welche innerhalb von einem der Unterverzeichnisse mindestens eine Datei enthalten, die junger ist als vorgegebener Parameter (ein Datum).
Hat jemand eine Idee?
ich versuche diesen Ablauf per Batch zu lösen, kriege es aber nicht hin. Kann mir jemand vielleicht helfen?
Ausgangsituation:
In einem Ordner sind mehrere Ordner enthalten. (Sie haben alle einen Namensmuster, z.B. "deploy_...")
Ziel:
Von diesen Ordner nur diejenigen zu kopieren (komplett, mit dem gesammten Inhalt und Struktur), welche innerhalb von einem der Unterverzeichnisse mindestens eine Datei enthalten, die junger ist als vorgegebener Parameter (ein Datum).
Hat jemand eine Idee?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 167419
Url: https://administrator.de/forum/nur-ordner-kopieren-die-dateien-enthalten-junger-als-167419.html
Ausgedruckt am: 23.04.2025 um 14:04 Uhr
6 Kommentare
Neuester Kommentar
Hallo Vanessa,
der Titel Deiner Frage "Nur Ordner kopieren, die Dateien enthalten älter als..." wieder spricht der Aussage "Von diesen Ordner nur diejenigen zu kopieren (komplett, mit dem gesamten Inhalt und Struktur), welche innerhalb von einem der Unterverzeichnisse mindestens eine Datei enthalten, die junger ist als vorgegebener Parameter (ein Datum)". Was denn nun?
Auf welcher Ebene der Verzeichnisstruktur soll denn geprüft werden, ob es Dateien gibt, die das Datumskriterium (wenn das denn mal eindeutig festgelegt ist) erfüllen?
Auf welchem/n Betriebssystem(en) soll das Script laufen?
Warum willst Du eine komplette Verzeichnisstruktur kopieren, wenn nur eine Datei irgendwo darin das Datumskriterium erfüllt?
Gruß
Friemler
der Titel Deiner Frage "Nur Ordner kopieren, die Dateien enthalten älter als..." wieder spricht der Aussage "Von diesen Ordner nur diejenigen zu kopieren (komplett, mit dem gesamten Inhalt und Struktur), welche innerhalb von einem der Unterverzeichnisse mindestens eine Datei enthalten, die junger ist als vorgegebener Parameter (ein Datum)". Was denn nun?
Auf welcher Ebene der Verzeichnisstruktur soll denn geprüft werden, ob es Dateien gibt, die das Datumskriterium (wenn das denn mal eindeutig festgelegt ist) erfüllen?
Auf welchem/n Betriebssystem(en) soll das Script laufen?
Warum willst Du eine komplette Verzeichnisstruktur kopieren, wenn nur eine Datei irgendwo darin das Datumskriterium erfüllt?
Gruß
Friemler
Hallo Vanessa,
teste mal das hier:
Den Code z.B. als
und
In den Zeilen 9-15 wird das übergebene Datum in seine Bestandteile zerlegt und so neu zusammengestellt, dass es für den
Die Zeile 18 liefert alle Verzeichnisse im Quellverzeichnis, in denen der
Wenn Dateien gefunden werden, wird ins Unterprogramm
Gruß
Friemler
teste mal das hier:
@echo off
setlocal
set "SrcDir=%~1"
set "DestDir=%~2"
for /f "eol= tokens=1-3 delims=." %%d in ("%~3") do (
set "Day=%%d"
set "Month=%%e"
set "Year=%%f"
)
set "YoungerThan=%Month%-%Day%-%Year%"
for /d %%d in ("%SrcDir%\*.*") do (
for /f "delims=" %%f in ('xcopy /ehl /d:%YoungerThan% "%%d\*.*" c:\ ^| find /v "Datei(en) kopiert"') do (
set "ActDirFullPath=%%d"
set "ActDirName=%%~nxd"
call :ProcessDir
)
)
exit /b
:ProcessDir
if "%OldDir%" equ "%ActDirFullPath%" exit /b
set "OldDir=%ActDirFullPath%"
xcopy /kreischy "%ActDirFullPath%\*.*" "%DestDir%\%ActDirName%"
exit /b
Den Code z.B. als
DeployCopy.cmd
speichern. Aufruf mitDeployCopy "QuellVerzeichnis" "ZielVerzeichnis" TT.MM.YYYY
QuellVerzeichnis
enthält Deine Deploy
-Verzeichnisse, ZielVerzeichnis
ist ja klar TT.MM.YYYY
ist das Datum, also im Format "Tag Punkt Monat Punkt Jahr".In den Zeilen 9-15 wird das übergebene Datum in seine Bestandteile zerlegt und so neu zusammengestellt, dass es für den
XCOPY
-Befehl in Zeile 19 verwertbar ist.Die Zeile 18 liefert alle Verzeichnisse im Quellverzeichnis, in denen der
XCOPY
-Befehl in Zeile 19 dann nach Dateien sucht, die jünger als das angegebene Datum sind. Wegen dem Parameter /l
werden die gefundenen Dateien nur aufgelistet, nicht kopiert.Wenn Dateien gefunden werden, wird ins Unterprogramm
ProcessDir
gesprungen. Hier wird das von der äußeren FOR
-Schleife im Hauptprogramm aktuell verarbeitete Verzeichnis in eine Variable geschrieben. Nur wenn das beim letzten Aufruf von ProcessDir
gemerkte Verzeichnis vom aktuellen verschieden ist, wird mit dem XCOPY
-Befehl in Zeile 33 das aktuelle Deploy
-Verzeichnis kopiert. So wird verhindert, dass die Kopieraktion eines Deploy
-Verzeichnisses mehrmals durchgeführt wird, auch wenn XCOPY
aus Zeile 19 mehrere jüngere Dateien findet.Gruß
Friemler
Hallo Vanessa,
gern geschehen.
Aber mit "virtuellen Listen" hat das eigentlich nichts zu tun. Ich benutze in Zeile 19
Um Zeit zu sparen und wirklich nur die jüngeren Dateien in ein Verzeichnis mit den Master-Versionen der verschiedenen Deploy-Ordner einzupflegen, könntest Du folgende gekürzte Version verwenden:
Sollte das Zielverzeichnis auf einer Netzwerkfreigabe liegen, wäre
Gruß
Friemler
gern geschehen.
Aber mit "virtuellen Listen" hat das eigentlich nichts zu tun. Ich benutze in Zeile 19
XCOPY
nur dazu, um den Aufruf des Unterprogramms ProcessDir
zu triggern. Sobald XCOPY
etwas ausgibt (Namen von gefundenen Dateien), wird der Rumpf der FOR
-Schleife ausgeführt (Zeilen 20 bis 22) und damit das Unterprogramm gestartet. Die Ausgabe von dem Zeile-19-XCOPY
wird nicht weiterverarbeitet.Um Zeit zu sparen und wirklich nur die jüngeren Dateien in ein Verzeichnis mit den Master-Versionen der verschiedenen Deploy-Ordner einzupflegen, könntest Du folgende gekürzte Version verwenden:
@echo off
setlocal
set "SrcDir=%~1"
set "DestDir=%~2"
for /f "eol= tokens=1-3 delims=." %%d in ("%~3") do (
set "Day=%%d"
set "Month=%%e"
set "Year=%%f"
)
set "YoungerThan=%Month%-%Day%-%Year%"
for /d %%d in ("%SrcDir%\*.*") do (
xcopy /krischy /d:%YoungerThan% "%%d\*.*" "%DestDir%\%%~nxd"
)
Sollte das Zielverzeichnis auf einer Netzwerkfreigabe liegen, wäre
ROBOCOPY
für die Aufgabe besser geeignet, da es Sicherheitsmechanismen gegen Netzwerkfehler eingebaut hat.Gruß
Friemler