PDA

Vollständige Version anzeigen : Datum vergleichen per Batch


sisko
02.01.2006, 14:00
Hallo.

Ich habe eine Frage:

Ich brauche eine Batch-Datei, die verschiedene Aktionen ausführen soll, wenn das Dateidatum einer Datei im Ordner c:\ABC größer ist als das dateidatum in Ordner c:\XYZ

Gibt es da ne einfache Möglichkeit ?

Joachim Hofmann
02.01.2006, 17:04
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet">

<span style="background-color: #ffffff"><font color="#008000">:: xcopytest.bat</font></span>

<span style="background-color: #ffffff"><font color="#008000">:: Ein Ansatz mit xcopy (ohne tatsächliches Kopieren):</font></span>
<span style="background-color: #ffffff"><font color="#008000">:: Folgendes listet Dateien auf, die neuer sind, und übergibt sie dem Programm DIR:</font></span>

<font color="#008080">set</font><font color="#008080"> Quellverz</font><font color="#804040"><b>=</b></font>c:\temp1\*.*
<font color="#008080">set</font><font color="#008080"> Zielverz</font><font color="#804040"><b>=</b></font>c:\temp2\
<font color="#008080">xcopy</font> <font color="#ff00ff">&quot;</font><font color="#008080">%Quellverz%</font><font color="#ff00ff">&quot;</font> <font color="#ff00ff">&quot;</font><font color="#008080">%Zielverz%</font><font color="#ff00ff">&quot;</font> <font color="#6a5acd">/d</font> <font color="#6a5acd">/l</font> <font color="#6a5acd">/y</font><font color="#804040"><b> | </b></font><font color="#008080">DIR</font>

<span style="background-color: #ffffff"><font color="#008000">:: oder erstmal sortiert in eine Datei umleiten</font></span>
<font color="#008080">xcopy</font> <font color="#ff00ff">&quot;</font><font color="#008080">%Quellverz%</font><font color="#ff00ff">&quot;</font> <font color="#ff00ff">&quot;</font><font color="#008080">%Zielverz%</font><font color="#ff00ff">&quot;</font> <font color="#6a5acd">/d</font> <font color="#6a5acd">/l</font> <font color="#6a5acd">/y</font><font color="#804040"><b> | </b></font><font color="#008080">SORT</font> &gt; Liste.txt
<font color="#008080">TYPE</font> Liste.txt

<font color="#008080">PAUSE</font>

</div>

sisko
04.01.2006, 08:42
:: xcopytest.bat

:: Ein Ansatz mit xcopy (ohne tatsächliches Kopieren):
:: Folgendes listet Dateien auf, die neuer sind, und übergibt sie dem Programm DIR:

set Quellverz=c:\temp1\testdatei.zip
set Zielverz=c:\temp2\
xcopy "%Quellverz%" "%Zielverz%" /d /l /y | DIR

:: oder erstmal sortiert in eine Datei umleiten
xcopy "%Quellverz%" "%Zielverz%" /d /l /y | SORT > Liste.txt
TYPE Liste.txt

PAUSE

Danke erst mal...
Aber wie kann ich jetzt steuern, dass z.B. die Zip-Datei nur dann entpackt werden soll, wenn sie auch neu dahin kopiert wurde?
Jetzt steht ja nur der Text in der Textdatei drin. Ein errorlevel wäre aber in beiden Fällen der gleiche, egal ob kopiert oder nicht !

Joachim Hofmann
04.01.2006, 13:03
Hallo,

Ich habe die Batch erstmal so erweitert, daß sie das tut, was Du ursprünglich wolltest.
Sie macht eine Listendatei von Dateien, die in Quellverz neuer sind, alls in Zielverz.
Tatsächlich kopiert wird hier aber (noch) nicht, das macht der /l - Parameter von XCOPY.
Die Zeile in dem FOR-Konstrukt liefert mit der Variablen %%I jeden einzeln Eintag in der Listendatei.
Um die jeweiligen Dateinamen z.B. einem Entpackprogramm zu übergeben, kannst du statt der ECHO-Zeile schreiben:


<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet">

&lt;meinpfad&gt;Zipprogramm.exe -unzip <font color="#008080">%%I</font>

</div>

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet">

<span style="background-color: #ffffff"><font color="#008000">:: Dateivergleich.bat mit Ausgabe in Listendatei und Verarbeitung der Einträge</font></span>

<span style="background-color: #ffffff"><font color="#008000">:: Variablen</font></span>
<font color="#008080">SET</font><font color="#008080"> Quellverz</font><font color="#804040"><b>=</b></font>c:\temp1\*.*
<font color="#008080">SET</font><font color="#008080"> Zielverz</font><font color="#804040"><b>=</b></font>c:\temp2\
<font color="#008080">SET</font><font color="#008080"> Listendatei</font><font color="#804040"><b>=</b></font>.\Liste.txt

<span style="background-color: #ffffff"><font color="#008000">:: Dateinamen sortiert in eine Datei umleiten, dabei mit FIND die Zeile &quot;N Datei(en)&quot; wegschmeissen</font></span>
<font color="#008080">xcopy</font> <font color="#ff00ff">&quot;</font><font color="#008080">%Quellverz%</font><font color="#ff00ff">&quot;</font> <font color="#ff00ff">&quot;</font><font color="#008080">%Zielverz%</font><font color="#ff00ff">&quot;</font> <font color="#6a5acd">/d</font> <font color="#6a5acd">/l</font> <font color="#6a5acd">/y</font><font color="#804040"><b> | </b></font><font color="#008080">SORT</font><font color="#804040"><b> | </b></font><font color="#008080">FIND</font> <font color="#6a5acd">/v</font> <font color="#ff00ff">&quot;Datei(en)&quot;</font> &gt; <font color="#008080">%Listendatei%</font>

<span style="background-color: #ffffff"><font color="#008000">:: mit FOR die Datei Listendatei Zeile für Zeile ausgeben</font></span>
<font color="#804040"><b>FOR</b></font> <font color="#6a5acd">/F</font> <font color="#ff00ff">&quot;eol=; tokens=</font><font color="#ff00ff">1</font><font color="#ff00ff">&quot;</font> <font color="#008080">%%I</font> in (<font color="#008080">%Listendatei%</font>) DO (
<font color="#008080">ECHO</font><font color="#ff00ff"> FOR bearbeitet die Zeile mit dem Eintrag: </font><font color="#008080">%%I</font>
)

<font color="#008080">PAUSE</font>

</div>

Unklar ist mir bis jetzt, ob Du denn auch "wirklich" kopieren willst, und wenn ja, welche Dateien, die Originalen, oder die "Ausgepackten" oder ...

sisko
04.01.2006, 14:59
Danke. Werde das mal morgen ausprobieren.

Das Zeil ist ganz einfach.
Ich bekomme jede Nacht 7 DB-Backups als ZIP-Dateien à ~ 90 MB.

Die sollen vom Fileserver auf den Test-Server kopiert werden und dann ausgepackt werden und automatisch wieder auf dem Testserver wiederhergestellt werden.
Das ganze funktioniert auch perfekt, dauert aber insgesamt ca. 2 Stunden.
Ich will halt erreichen, dass nur dann die einzelne Zip-Datei kopiert wird, entpackt wird und wiederhergestellt wird, wenn sie auch wirklich neuer ist, als die alte vorhandene (da manchmal die DB-Backups nicht gemacht werden).
Wenn also von den 7 backups nur 2 neu sind, dann sollen auch nur die beiden neuen bearbeitet werden, um nicht immer 2 Stunden Arbeit zu haben, sondern dann eben nur ne gute halbe Stunde...

... Und ja ... wenn die Dateien neuer sind, sollen sie kopiert werden :)

sisko
04.01.2006, 16:31
Also das ganze klappt wunderbar, aber eine Sache wäre noch der Bonus...

Wenn ich in die liste.txt gucke, steht ja da der ganze Pfad ...\...\...\datei.xxx drin
Wie bekomme ich nun davon aber NUR den Dateinamen ???
entweder so, dass ich den aus der Datei ermitteln kann mit "findstring" oder so was, oder aber, dass beim kopieren auch nur der dateiname in die datei geschrieben wird. Das würde schon reichen.

Joachim Hofmann
05.01.2006, 10:11
Nur den Dateinamen im FOR-Konstrukt auslesen kannst Du, wenn du die eine Zeile
änderst auf:

...
ECHO FOR bearbeitet die Zeile mit dem Eintrag: %%~nxI
...

Das steht, wennn auch schwierig beschrieben, in der Hilfe zu FOR.

Joachim Hofmann
06.01.2006, 13:00
Übrigens gebrauche ich etwas ähnliches selber, da ist mir noch ein kleiner Fehler aufgefallen:
statt
FOR /F "eol=; tokens=1"
sollte es heißen
FOR /F "delims="

Das eol und tokens ist unwichtig, dafür würde es ohne "delims="
möglicherweise nicht richtig funktionieren, falls Dateinamen Leerzeichen enthalten.

sisko
06.01.2006, 15:26
Danke für die Info.

Das script funktioniert jetzt einwandfrei auch ohne "delims". Werde das aber mal vorsichtshalber noch ändern.

Nun gibt es bei uns wenigstens automatische Wiederherstellung von DB-Backups von den Backups, die neuer sind, als die bereits vorhandenen :)