ulirlk
Goto Top

Xcopy mit Parameter D - Kopieren von Dateien, die neuer sind als ein spezieller Zeitsstempel

Hallo,
ich habe folgendes Problem: In einem speziellen Ordner eines Subsystems werden in unterschiedlichen Zeitabständen Word-Dokumente zum Export in ein anderes System bereitgestellt.

Ich möchte nun den Kopierprozeß in dieses andere System automatisieren über eine Batch-Datei. Mein Script sieht momentan so aus:

Zunächst setze ich einige Variablen:

@echo OFF
CLS
SET _FILE_COPY_LOG=V:\Ordner1\Logdatei\Logdatei.log
SET _QUELL_LAUFWERK=W:
SET _QUELL_DATEI_ENDUNG=doc
SET _QUELL_ORDNER_DATEIEN=W:\Subsystem_export
SET _ZIEL_ORDNER_DATEIEN=V:\Import

Zur Protokollierung soll Datum und Uhrzeit mitgeschrieben werden:
echo >> %_FILE_COPY_LOG%
echo -----------------------------Neuer Durchlauf------------------------------- >> %_FILE_COPY_LOG%
echo >> %_FILE_COPY_LOG%
date /t >> %_FILE_COPY_LOG%
time /t >> %_FILE_COPY_LOG%

Jetzt beginnen meine "Probleme". Aus dem Inhalt von 4 verschiedenen Textdateien (jeweils nur eine Zeile) sollen 4 Variablen mit Leben gefüllt werden. Diese 4 Textdateien sind beim allerersten Durchlauf der Batch von mir "per Hand" erzeugt worden und sollen später durch das Programm automatisch neu verändert werden.

@for /f "delims=" %%i in (V:\Ordner1\Logdatei\Tag.txt) do echo set /p Tag = %%i
@for /f "delims=" %%j in (V:\Ordner1\Logdatei\Monat.txt) do echo set /p Monat = %%j
@for /f "delims=" %%k in (V:\Ordner1\Logdatei\Jahr.txt) do echo set /p Jahr = %%k
@for /f "delims=" %%l in (V:\Ordner1\Logdatei\Uhrzeit.txt) do echo set /p Uhrzeit = %%l

Nun möchte ich NUR die Dateien kopieren, die NACH dem "Zeitstempel" erzeugt wurden. Der Zeitstempel setzt sich aus Tag, Monat, Jahr und Uhrzeit wie o.a. zusammen. Gleichzeitig soll das Ereignis protokolliert werden.

xcopy %_QUELL_ORDNER_DATEIEN% %_ZIEL_ORDNER_DATEIEN% /D:%Monat%-%Tag%-%Jahr% >> %_FILE_COPY_LOG%

Und hier kommt es zur Fehlermeldung: Unzulässiger Parameter: D/--
Verstehe ich nicht, da ich die Variablen doch gesetzt habe ??!!

Noch nicht berücksichtigt habe ich die Uhrzeit (weiß nicht, wie ich die einbauen kann). Aber es müßte doch wenigstens mit den Angaben Tag, Monat und Jahr funktionieren!!!!

Ich habe beim Stöbern noch eine andere "Art" des Füllens von Variablen durch Auslesen von Textdateien gefunden und ausprobiert. Leider mit dem gleichen negativen Ergebnis:

@set /P Tag=<V:\Ordner1\Logdatei\Tag.txt
@set /P Monat=<V:\Ordner1\Logdatei\Monat.txt
@set /P Jahr=<V:\Ordner1\Logdatei\Jahr.txt
@set /P Uhrzeit=<V:\Ordner1\Logdatei\Uhrzeit.txt

Auch hier erhalte ich als Fehlermeldung: Unzulässiger Parameter D/

Im weiteren Verlauf soll die Batchdatei einen neuen Zeitstempel erzeugen und ihn dann abspeichern:

@for /f "tokens=1 delims=." %%a in ("%date%") Do @set var1=%%a
@for /f "tokens=2 delims=." %%b in ("%date%") Do @set var2=%%b
@for /f "tokens=3 delims=." %%c in ("%date%") Do @set var3=%%c


echo %var1% > V:\Ordner1\Logdatei\Tag.txt
echo %var2% > V:\Ordner1\Logdatei\Monat.txt
echo %var3% > V:\Ordner1\Logdatei\Jahr.txt
echo %time% > V:\Ordner1\Logdatei\Uhrzeit.txt

Ist (wahrscheinlich) ein bißchen umständlich, aber dieser Teil der Batch funktioniert:

Ich hoffe, ich habe das Problem so geschildert, dass man es nachvollziehen kann ???

Grüße,
Uli

Content-Key: 83304

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

Printed on: April 18, 2024 at 16:04 o'clock

Member: bastla
bastla Mar 17, 2008 at 14:17:40 (UTC)
Goto Top
Hallo ulirlk und willkommen im Forum!

Versuch es mit folgender Zeile (als Vorlage für die weiteren):
for /f "delims=" %%i in (V:\Ordner1\Logdatei\Tag.txt) do set Tag=%%i  
Der Hilfe zu "xcopy" ist zu entnehmen, dass für "/D" nur ein Datum, aber keine Uhrzeit angegeben werden kann.
Noch eine Alternative zum Zwischenspeichern des kompletten Timestamps (bzw eigentlich "Date"stamps face-wink):
echo %date:~-7,2%-%date:~-10,2%-%date:~-4%>V:\Ordner1\Logdatei\Timestamp.txt
Die Begründung, warum %date% von "hinten" (-7) her zerlegt wird, ist die zwischen W2000 und XP unterschiedliche Ausgabe (mit/ohne Wochentag) - so funktioniert es mit beiden Systemen (BTW: Das von Dir verwendete BS lässt sich zwar erraten, Du solltest es aber trotzdem besser auch anführen).

Grüße
bastla
Member: ulirlk
ulirlk Mar 17, 2008 at 15:20:38 (UTC)
Goto Top
Hallo bastla,
danke für deinen Tip. Zunächst einmal BS ist Windows 2003.

Ich habe jetzt die Erstellung des Zeitsstempels so wie du es beschrieben hast unten in meiner Batch geändert:

echo %date:~-7,2%-%date:~-10,2%-%date:~-4%>V:\Ordner1\Logdatei\Timestamp.txt

Es wird auch beim Durchlauf die Datei mit dem heutigen Datum erzeugt. Jetzt habe ich im oberen Bereich das Auslesen aus den 4 Dateien Tag, Monat, Jahr und Uhrzeit abgeändert, so dass nur die Datei Timestamp.txt abgefragt wird:

also:
@for /f "delims=" %%i in (V:\Ordner1\Logdatei\Tag.txt) do echo set /p Tag = %%i
@for /f "delims=" %%j in (V:\Ordner1\Logdatei\Monat.txt) do echo set /p Monat = %%j
@for /f "delims=" %%k in (V:\Ordner1\Logdatei\Jahr.txt) do echo set /p Jahr = %%k
@for /f "delims=" %%l in (V:\Ordner1\Logdatei\Uhrzeit.txt) do echo set /p Uhrzeit = %%l

komplett ersetzt durch:
for /f "delims=" %%i in (V:\Ordner1\Logdatei\Timestamp.txt) do set Timestamp = %%i

Die nächste Zeile:
xcopy %_QUELL_ORDNER_DATEIEN% %_ZIEL_ORDNER_DATEIEN% /D:%Monat%-%Tag%-%Jahr% >> %_FILE_COPY_LOG%

habe ich dann abgeändert in:
xcopy %_QUELL_ORDNER_DATEIEN% %_ZIEL_ORDNER_DATEIEN% /D:%Timestamp% >> %_FILE_COPY_LOG%

und erhalte leider die Fehlermeldung: Unzulässige Option

Verstehe ich nicht, da der Inhalt von Timestamp doch 03-17-2008 ist und somit der Xcopy-Befehl mit Parameter D richtig gesetzt ist?????
Member: bastla
bastla Mar 17, 2008 at 16:09:02 (UTC)
Goto Top
Hallo ulirlk!

In Batchdateien solltest Du möglichst wenige Leerzeichen verwenden, daher:
for /f "delims=" %%i in (V:\Ordner1\Logdatei\Timestamp.txt) do set Timestamp=%%i  

Grüße
bastla

P.S.: Falls Dir (hoffentlich) die Formatierung der obigen Befehlszeile gefällt: Das kannst Du in Deinen Kommentaren auch haben - einfach zwischen -Tags setzen ... face-wink
Member: ulirlk
ulirlk Mar 18, 2008 at 07:41:29 (UTC)
Goto Top
Hallo bastla,
vielen Dank für den Hinweis mit den Leerzeichen. Hat funktioniert. Hatte das wegen der Übersichtlichkeit gemacht und prompt "das Eigentor" geschossen. Werde das also zukünftig vermeiden.

Damit ist mein Problem aber (leider) nur zur Hälfte gelöst. Ich kann jetzt zwar alle Dateien ab dem Datum des Zeit-/Tagesstempels kopieren, aber eben nicht NUR DIE ab einer gewissen Uhrzeit.

Gibt es da vielleicht einen anderen Weg??

Warum ich nur diese Dateien brauche:
Die kopierten Dokumente aus dem Subsystem sollen in dem anderen System weiterverarbeitet werden, d.h. sobald die Dokumente kopiert sind, sollen diese Dokumente nach Bearbeitung aus dem Zielordner wieder entfernt werden. Läuft aber meine Batch dann erneut an, kopiert sie mir wieder ALLE Dokumente des Tages in den Zielordner.....murks......

Kann ich die Namen der schon kopierten Dokumente eventuell in eine Datei (vielleicht ini) schreiben, so dass die Batch beim Kopiervorgang in die Datei "reinschaut" und nur die Dokumente kopiert, die NOCH NICHT vorher schon einmal kopiert wurden?

Grüße,
Uli
Member: bastla
bastla Mar 18, 2008 at 08:47:01 (UTC)
Goto Top
Hallo ulirlk!

Um Dateien nur ein einziges Mal zu kopieren, bietet "xcopy" mit dem Schalter "/m" eine bessere Möglichkeit.

Hintergrund: Wenn eine Datei verändert wird (inkludiert auch das erstmalige Speichern), wird als Kennzeichen für "noch zu archivieren" das "Archiv-Attribut" (oder "Archiv-Bit") gesetzt - kannst Du Dir im Explorer unter "Dateieigenschaften / Erweitert" oder mit dem CMD-Befehl "attrib" anzeigen lassen bzw selbst verändern. Bei einer Datensicherung wird dieses Attribut üblicherweise gelöscht, damit eine Inkrementsicherung (= nur veränderte Dateien) möglich wird.

Der genannte Schalter "/m" sorgt nun dafür, dass nur Dateien mit gesetztem Archiv-Bit kopiert werden und (im Gegensatz zu "/a") entfernt danach diese Kennzeichnung.

Falls also nicht eine zwischenzeitliche Datensicherung des Quellordners durchgeführt wird, sollte es mit "xcopy /m" eigentlich klappen.

Grüße
bastla
Member: ulirlk
ulirlk Mar 18, 2008 at 09:00:55 (UTC)
Goto Top
Hallo bastla,
vielen Dank für den Tip. Kann ihn (leider) erst morgen ausprobieren, werde dann aber berichten.

Grüße, Uli
Member: ulirlk
ulirlk Mar 19, 2008 at 11:36:20 (UTC)
Goto Top
Hallo bastla,
toller Tip. Hat funktioniert. Echt klasse. Vielen Dank.

Grüße, Uli