vanessa
Goto Top

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?

Content-Key: 167419

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

Printed on: April 27, 2024 at 20:04 o'clock

Member: Friemler
Friemler Jun 03, 2011 at 09:51:19 (UTC)
Goto Top
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
Member: Vanessa
Vanessa Jun 04, 2011 at 13:08:22 (UTC)
Goto Top
Hallo Friemler,

danke für Feedback! Sorry, gestern war ein verrückter Tag. ;)

der Titel Deiner Frage "Nur Ordner kopieren, die Dateien enthalten älter als..." wieder spricht der Aussage..
Was denn nun?


Bereits korrigiert. "junger" natürlich, danke für die Aufmerksammkeit!

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?

Variabel. Auf allen im jeweilinen Ordner vorhandenen Ebenen.

Auf welchem/n Betriebssystem(en) soll das Script laufen?

Win XP, SP 3

Warum willst Du eine komplette Verzeichnisstruktur kopieren, wenn nur eine Datei irgendwo darin das Datumskriterium erfüllt?

Hm.. eine gute Frage. Die Verzeichnisse sind Deploy-Ordner von einem Test-System.
Sie könnten theoretisch Dateien enthalten, die früher geändert wurden, als der Parameter angibt, sollen aber beim späteren Vergleich mit dem Live-Stand nicht verloren gehen. Dieses ist aber eher eine zusätzliche Sicherheitsmassnahme, die wünschenswert, aber nicht obligatorisch ist, wenn man mit dem Datum-Parameter aufmerksam umgeht. Vielleicht hast Du Recht: es würde reichen, wenn nur die entsprechende Dateien kopiert werden. Beim richtig angegenenen Datum-Parameter werden es sowieso alle sein, stimmt? Wichtig dabei ist, dass die Ordner-Struktur beibehalten wird.

Ich denke dabei an xcopy (mit /d und /s Options) und innere for-Schleifen, kriege es alleine aber noch nicht hin.
Member: Friemler
Friemler Jun 04, 2011 at 15:12:47 (UTC)
Goto Top
Hallo Vanessa,

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 mit
DeployCopy "QuellVerzeichnis" "ZielVerzeichnis" TT.MM.YYYY

QuellVerzeichnis enthält Deine Deploy-Verzeichnisse, ZielVerzeichnis ist ja klar face-wink und 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
Member: Vanessa
Vanessa Jun 04, 2011 at 18:37:01 (UTC)
Goto Top
wow!

Der Trick mit "virtuellen Listen" in der Zeile 19 ist super! Das Umgehen mit lokalen Variablen war auch sehr lehrreich für mich.
Funktioniert genau wie gewünscht! Herzlichen Dank!!

Friemler, Du bist gut. ;)

Gruss
Vanessa
Member: Friemler
Friemler Jun 05, 2011 at 01:49:13 (UTC)
Goto Top
Hallo Vanessa,

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
Member: Vanessa
Vanessa Jun 05, 2011 at 14:01:47 (UTC)
Goto Top
Ok, alles klar.

Ich habe mich vielleicht etwas doof ausgedrückt: mit "virtuellen Liste" meinte ich die Ausgabe von xcopy - die Liste von jungeren Dateien. Dann kopiert (wenn nicht bereits geschehen) das Unterprogramm den gesamten (sehr gut!) Inhalt vom aktuellen Deploy-Ordner in den gleichnamigen Zielordner. Was kann man sich da noch mehr wünschen!! ))

Besten Dank noch mal!

Gruss
Vanessa