
WINDOWS 7






Automatisch Sicherungskopien erstellen und dabei ltere berschreiben:

Oft steht man vor der Aufgabe, bestimmte, auch verteilte Dateien, mit denen man
arbeitet, auf einen USB-Stick oder dergleichen zu bertragen, woanders zu bearbeiten,
dann wieder zurck zu bertragen etc. - ohne da dabei einzelne Dateien vergessen
oder vorgenommene Vernderungen durch berschreiben neuerer Dateien
mit lteren wieder verloren gehen - und das am besten mit einem einzigen Befehl.

Das geht automatisiert im DOS mit XCOPY:

Der Befehl XCOPY dient eigentlich dazu, ganze Verzeichnisse zu kopieren,
und behandelt deshalb einzelne Dateien, als wren es Verzeichnisse.

Andererseits kennt der Befehl COPY, der zum Kopieren einzelner Dateien
vorgesehen ist, zwar die Nachfrage (/- Y), ob eine bereits
vorhandene Datei dabei berschrieben werden soll - er kann aber nicht
prfen, ob die zu berschreibende Datei lter ist als die
berschreibende; was ihn fr einen automatischen Abgleich ziemlich
unbrauchbar macht.

Man kann jedoch XCOPY auch zum kopieren einzelner Dateien
mibrauchen, und XCOPY kann im Gegensatz zu COPY das
Datum der Dateien in Betracht ziehen. Will man also eine Batch- Datei schreiben,
die einen automatischen Dateienabgleich vornimmt, bei dem


1) alle spezifizierten Dateien, so sie existieren, in das jeweilige
Zielverzeichnis kopiert werden,


2) fehlende Dateien dabei ignoriert, und


3) ltere Dateien im Zielverzeichnis von jngeren berschrieben
werden,


4) jngere Dateien im Zielverzeichnis aber nicht,


und das ganze ohne Nachfrage, dann kann man folgende Anweisung in
die Batch- Datei schreiben:


echo d | Xcopy   "C:\Quellverzeichnis\irgendwas.zip" "D:\Zielverzeichnis\irgendwas.zip"/K/D/Y/H
echo d | Xcopy   "C:\Quellverzeichnis2\nochwas.zip"  "D:\Zielverzeichnis2\nochwas.zip"/K/D/Y/H
  ... usw

Achtung: Umlaute in den Dateinamen mssen mit einem "?" maskiert werden!
Bei Umlaute im Pfad hilft allerdings auch das nicht, da mu umfangreicher abgeholfen werden

- echo d | beantwortet die Nachfrage, um was es sich handelt, mit   "Datei"
- /K belt ggf. das "schreibgeschtzt"- Attribut
- /D prft, ob die Quelldatei neueren Datums ist (spezifische   Datumsangaben sind auch mglich)
- /Y unterdrckt die Nachfrage, ob eine   (ltere!) Zieldatei berschrieben werden soll
- /H kopiert auch System- und versteckte Dateien   (optional)
- /R berschreibt schreibgeschtzte Dateien.   (optional)


Will man zudem noch wissen, ob die entsprechende Datei sich von ihrer Kopie unterscheidet
-  ob die beiden Dateien identisch sind ob oder nicht - und zwar unabhngig davon, ob
sie danach berschreiben wurden, kann man vor diese Zeile jeweils noch zwei weitere
einfgen:


echo n | comp /L   "C:\Quellverzeichnis\irgendwas.zip" "D:\Zielverzeichnis\irgendwas.zip"  2> NUL
if errorlevel 1 Echo Die Dateien   sind NICHT IDENTISCH!    
echo   d | Xcopy "C:\Quellverzeichnis\irgendwas.zip" "D:\Zielverzeichnis\irgendwas.zip"/K/D/Y/H


- /L wirft Unterschiede bei gleich groen Dateien mit der zugehrigen Zeilennummer aus
- '2>NUL' unterdrckt die DOS- Nachfrage:   'Weitere Dateien vergleichen (J/N)?'
- echo n | beantwortet diese Nachfrage mit "Nein"


Auf diese Weise wird auch noch eine vernnftige Meldung ausgeworfen, so da man
an den Anfang der Batch- Datei


@ Echo Off

setzen kann.


Die Meldung lautet dann (bei unterschiedlich groen Dateien):

Vergleichen von C:\Quellverzeichnis\irgendwas.zip und D:\Zielverzeichnis\irgendwas.zip...
Dateien sind unterschiedlich gro.
Die Dateien sind NICHT IDENTISCH!
0 Datei(en)  kopiert

- falls die zweite Datei neuer ist, bzw.

1 Datei(en) kopiert

- falls sie lter war (jetzt nicht mehr)



Auf diese Weise braucht man nur eine Batch- Datei fr beide Zwecke:


Falls die Datei im Zielverzeichnis lter ist, wird sie ohne Nachfrage
berschrieben, falls sie neuer, also jngeren Datums ist, nicht.
In beiden Fllen aber wird gemeldet, ob sich die Dateien unterscheiden
- oder nicht.


Diese Dateien kann man dann manuellvergleichen und ggf. berschreiben
(letzteres ginge natrlich auch automatisch,mit einer
entsprechenden Befehlszeile in die andere Richtung). Man kann auch
mit ">> liste .txt" eine Liste aller unterschiedlichen Dateien
erstellen lassen.






Version I





@ echo off

REM	Echo.  = Zeilenumbruch

Echo.
Echo.
Echo.  			SICHERUNGSKOPIEN ERSTELLEN
Echo.
Echo. 	Ohne Rueckfrage - Das Fenster ggf. mit der Maus(!) schliessen,
Echo.	um den Prozess zu unterbrechen.
Echo.
Echo.	Weiter?
Echo.
Echo.

REM Untebrechung
PAUSE
PAUSE

Echo.
Echo.

REM Nie den letzten Ordner-Backslash weglassen! Wechsele in das Verzeichnis der Batch-Datei:
If Exist "C:\Batch-Verzeichnis\" 	(CD "C:\Batch-Verzeichnis\")    ELSE ECHO. FEHLER: "C:\Batch-Verzeichnis\" existiert nicht

REM Lsche die alte Liste:
If Exist "C:\Batch-Verzeichnis\liste.txt" 	Del "C:\Batch-Verzeichnis\liste.txt"


REM Kopiere auf Laufwerk D:/

Echo.
Echo.
Echo.
REM test1.zip
echo n | comp /L "C:\Quell-Verzeichnis\test1.zip"	"D:\Ziel-Verzeichnis\test1.zip"  2> NUL
if errorlevel 1 Echo Die Dateien sind NICHT IDENTISCH!
if errorlevel 1 Echo  NICHT IDENTISCH:  "C:\Quell-Verzeichnis\test1.zip"	"D:\Ziel-Verzeichnis\test1.zip"  >> "C:\Batch-Verzeichnis\liste.txt"

echo d | Xcopy "C:\Quell-Verzeichnis\test1.zip"	"D:\Ziel-Verzeichnis\test1.zip" /K /D /Y /H

Echo.
Echo.
Echo.
REM test2.zip
echo n | comp /L "C:\Quell-Verzeichnis\test2.zip"	"D:\Ziel-Verzeichnis\test2.zip"  2> NUL
if errorlevel 1 Echo Die Dateien sind NICHT IDENTISCH!
if errorlevel 1 Echo  NICHT IDENTISCH:  "C:\Quell-Verzeichnis\test2.zip"	"D:\Ziel-Verzeichnis\test2.zip"  >> "C:\Batch-Verzeichnis\liste.txt"

echo d | Xcopy "C:\Quell-Verzeichnis\test2.zip"	"D:\Ziel-Verzeichnis\test2.zip" /K /D /Y /H


Echo.
Echo.
Echo    WEITER?
Echo.

Echo.
REM Die Unterbrechung dient der Begutachtung und der Entscheidung
PAUSE
PAUSE

Echo.
Echo.
Echo.

REM notizen1.txt
echo n | comp /L  "C:\Quell-Verzeichnis\notizen1.txt"	"D:\Ziel-Verzeichnis\notizen1.txt"  2> NUL
if errorlevel 1 Echo Die Dateien sind NICHT IDENTISCH!
if errorlevel 1 Echo  NICHT IDENTISCH:  "C:\Quell-Verzeichnis\notizen1.txt"	"D:\Ziel-Verzeichnis\notizen1.txt"  >> "C:\Batch-Verzeichnis\liste.txt"

echo d | Xcopy  "C:\Quell-Verzeichnis\notizen1.txt"	"D:\Ziel-Verzeichnis\notizen1.txt" /K /D /Y /H

Echo.
Echo.
Echo.
REM notizen2.txt
echo n | comp /L  "C:\Quell-Verzeichnis\notizen2.txt"	"D:\Ziel-Verzeichnis\notizen2.txt"  2> NUL
if errorlevel 1 Echo Die Dateien sind NICHT IDENTISCH!
if errorlevel 1 Echo  NICHT IDENTISCH:  "C:\Quell-Verzeichnis\notizen2.txt"	"D:\Ziel-Verzeichnis\notizen2.txt"  >> "C:\Batch-Verzeichnis\liste.txt"

echo d | Xcopy  "C:\Quell-Verzeichnis\notizen2.txt"	"D:\Ziel-Verzeichnis\notizen2.txt" /K /D /Y /H


Echo.
Echo.
Echo    WEITER?
Echo.

Echo.
REM Die Unterbrechung dient der Begutachtung und der Entscheidung
PAUSE
PAUSE

Echo.
Echo.
Echo.

Type "C:\Batch-Verzeichnis\liste.txt"

Echo.
Echo.
Echo.
Echo. ENDE

REM OPTIONAL: Lsche die Liste
REM del "C:\Batch-Verzeichnis\liste.txt"

Echo.
PAUSE






Version II


Mit folgenden Raffinessen:

1.	FC "Pfad/Datei"  Pfad/Datei >NUL 2>&1 prft, ob ein Dateipfad Leerzeichen enthlt
2.	chcp 1252 >NUL erlaubt Umlaute auch im Dateipfad, und unterdrckt die Meldung
3.	Mit Set FILENAME=%%~nxA wird der Dateiname aus einem Pfad extrahiert und mit
4.	DIR "%QUELLE%" | findstr /I /C:"%FILENAME%" die Dateizeile aus dem Verzeichnis gefischt,
5.	so da nur die angesprochene Datei, diese in DOS aber mit Datum und Gre ausgegeben wird
6.	chcp 850 >NUL setzt dabei die Ausgabe zum Vergleichen wieder auf die ursprnglich interne zurck

[ Weitere extrahierbare Eigenschaften sind in der CMD- Eingabe Aufforderung oder DOS-Box
beispielsweise unter FOR /? oder CALL /? oder zu finden; ansonsten FINDSTR /? ]

7.	Die Ausgabemeldung von COMP wird mit   2> NUL unterdrckt
8.	Die unnachgiebige Ausgabe N von ECHO N | COMP wird mit "Nachricht:" maskiert
9.	Ausgabe- und Fehlermeldung von XCOPY wird mit 2>&1 in eine Variable umgeleitet -
10.	Beide werden ber eine temporre Datei wechselweise abgerufen und ausgewertet
11.	Ausgabe auf dem Bildschirm und auch in eine Datei
12.	Aufteilung in eine Listen - und eine Ausfhrungsdatei





Datei I: Listendatei zur Auflistung der Quell- und Ziel- Dateien
(beliebig benennbar)






REM CheckCop Dateiabgleich Version 2b


@ echo off


REM Version 2


REM ------------------------------------------------------------------------------------------


REM >> Hier die GRUND-EINSTELLUNGEN SETZEN!


REM ------------------------------------------------------------------------------------------


REM ACHTUNG! 	Beim '=' und am Zeilenende keine Leerzeichen zulassen!

REM ACHTUNG! 	Auch im Verzeichnisnamen keine Leerzeichen zulassen!
REM ACHTUNG! 	Notfalls auf 8 Zeichen im DOS-Syntax verkrzen:

REM Das Verzeichnis '12345678' lautet dann '12345678'!
REM Das Verzeichnis '123456789' lautet dann '123456~1'!
REM Das Verzeichnis '123 4567' lautet dann auch '123456~1' - es sei denn, es gib schon so eins, dann ~2!
REM Das Verzeichnis 'a b c' lautet dann 'abc~1'!


REM Das ARBEITSVERZEICHNIS, in dem sich diese Datei befindet -WICHTIG:

REM OHNE den letzten Ordner-Backslash\ !


SET BATCHVERZEICHNIS=C:\Users\Mein_Verzeichnis\TEST



REM Das ZIELLAUFWERK, auf dem sich die Sicherungen befinden werden :

SET ZIELLAUFWERK=Z:\




REM In der Regel so zu lassen:

SET SYSTEMMELDUNG11="0 Datei(en) kopiert"
SET SYSTEMMELDUNG22="Zugriff verweigert"

SET AUSGABEDATEI=%BATCHVERZEICHNIS%\ausgabe.txt
SET MELDUNG=%BATCHVERZEICHNIS%\MELDUNG.txt


REM ------------------------------------------------------------------------------------------

REM Ende der Grundeinstellungen

REM ------------------------------------------------------------------------------------------


Echo.
Echo.  			SOLL ICH WIRKLICH?!
Echo.

PAUSE

Echo.
Echo.  	VORSICHT MIT DER TASTE! Fenster mit der MAUS!! Schliessen!
Echo.

Echo.

PAUSE

Echo.
Echo.  	- BEGINNE MIT DER KOPIERAKTION -
Echo.

PAUSE

REM ------------------------------------------------------------------------------------------


REM Vorbereitung (intern):

Echo.
Echo.

If Exist "%BATCHVERZEICHNIS%\" (CD "%BATCHVERZEICHNIS%\") ELSE (ECHO. FEHLER: "%BATCHVERZEICHNIS%\" existiert nicht. )
If NOT Exist "%BATCHVERZEICHNIS%\" GOTO ENDE

If NOT Exist "%BATCHVERZEICHNIS%\MACHCOP.BAT" (ECHO FEHLER: "%BATCHVERZEICHNIS%\MACHCOP.BAT" kann nicht gefunden werden. )
If NOT Exist "%BATCHVERZEICHNIS%\MACHCOP.BAT" GOTO ENDE

FC "%BATCHVERZEICHNIS%\MACHCOP.BAT"	%BATCHVERZEICHNIS%\MACHCOP.BAT >NUL 2>&1
If Errorlevel 1 (Echo %0%) & (ECHO. Im Arbeitspfad duerfen sich keine Leer- oder Sonderzeichen befinden.)
If Errorlevel 1 (ECHO Ggf. 8.3-Format verwenden!) & GOTO ENDE

If NOT Exist "%ZIELLAUFWERK%" (ECHO. FEHLER: Laufwerk "%ZIELLAUFWERK% existiert nicht")
If NOT Exist "%ZIELLAUFWERK%" GOTO ENDE

If Exist %AUSGABEDATEI% 	Del %AUSGABEDATEI%




REM ------------------------------------------------------------------------------------------


REM >> DATEIPFADE AUFLISTEN


REM ------------------------------------------------------------------------------------------


REM Copy to Ziel


REM >> Im Folgenden jeweils QUELLE, ZIEL und SCHALTER setzen - beliebig oft:

REM Mit vollem Pfad, also 	SET QUELLE=C:\... \Quelldatei, 	SET ZIEL=Z:\... \Zieldatei

REM ACHTUNG: 	Beim    '=' 	-und am Zeilenende-  	keine Leerzeichen zulassen!



REM --------------

REM --------------









REM Testdateien:

chcp 1252 >NUL
SET QUELLE=%BATCHVERZEICHNIS%\Tstvereichns\alt.txt

chcp 1252 >NUL
SET ZIEL=%BATCHVERZEICHNIS%\Tstvereichns\neu.txt

REM Auch schreibgeschtzte Zieldateien berschreiben? SCHALTER=J/N
SET SCHALTER=N

CALL MACHCOP.BAT



REM --------------




REM Testdateien:

chcp 1252 >NUL
SET QUELLE=%BATCHVERZEICHNIS%\Tstvereichns\neu.txt

chcp 1252 >NUL
SET ZIEL=%BATCHVERZEICHNIS%\Tstvereichns\alt.txt

REM Auch schreibgeschtzte Zieldateien berschreiben? SCHALTER=J/N
SET SCHALTER=N

CALL MACHCOP.BAT



REM --------------




REM Testdateien:

chcp 1252 >NUL
SET QUELLE=%BATCHVERZEICHNIS%\Tstvereichns\neu.txt

chcp 1252 >NUL
SET ZIEL=%BATCHVERZEICHNIS%\Tstvereichns\alt.txt

REM Auch schreibgeschtzte Zieldateien berschreiben? SCHALTER=J/N
SET SCHALTER=J

CALL MACHCOP.BAT



REM --------------




REM Testdateien:

chcp 1252 >NUL
SET QUELLE=%BATCHVERZEICHNIS%\Tstvereichns\3.txt

chcp 1252 >NUL
SET ZIEL=%BATCHVERZEICHNIS%\Tstvereichns\4.txt

REM Auch schreibgeschtzte Zieldateien berschreiben? SCHALTER=J/N
SET SCHALTER=N

CALL MACHCOP.BAT



REM --------------




REM Testdateien:

chcp 1252 >NUL
SET QUELLE=%BATCHVERZEICHNIS%\Tstvereichns\4.txt

chcp 1252 >NUL
SET ZIEL=%BATCHVERZEICHNIS%\Tstvereichns\3.txt

REM Auch schreibgeschtzte Zieldateien berschreiben? SCHALTER=J/N
SET SCHALTER=N

CALL MACHCOP.BAT



REM --------------





REM Testdateien:

chcp 1252 >NUL
SET QUELLE=%BATCHVERZEICHNIS%\Tstvereichns\4.txt

chcp 1252 >NUL
SET ZIEL=%BATCHVERZEICHNIS%\Tstvereichns\3.txt

REM Auch schreibgeschtzte Zieldateien berschreiben? SCHALTER=J/N
SET SCHALTER=J

CALL MACHCOP.BAT



REM --------------




REM Testdateien:

chcp 1252 >NUL
SET QUELLE=%BATCHVERZEICHNIS%\Tstvereichns\4.txt

chcp 1252 >NUL
SET ZIEL=%BATCHVERZEICHNIS%\Tstvereichns\3.txt

REM Auch schreibgeschtzte Zieldateien berschreiben? SCHALTER=J/N
SET SCHALTER=N

CALL MACHCOP.BAT



REM --------------




REM ------------------------------------------------------------------------------------------

REM Ende Datei-Eingabe

REM ------------------------------------------------------------------------------------------


Echo.
Echo.
Echo.

Echo ///////////////////////////////////////////////////////////////////////////////


Echo.
Echo.
Echo.


REM ------------------------------------------------------------------------------------------


Echo - Um den Prozess zu beenden: Die Ausgabedatei und das DOS- Fenster schliessen - >> %AUSGABEDATEI%
Echo.
Echo.


REM OPTIONAL

REM Resultat noch einmal auf dem Bildschirm anzeigen:

ECHO 	#########################  RESULTAT #########################
Echo.
Echo.

Type %AUSGABEDATEI%

ECHO 	#########################  RESULTAT ENDE #########################
REM ECHO         Um den Prozess zu beenden: Ausgabedatei und DOS- Fenster schliessen


REM Resultat ffnen
%AUSGABEDATEI%


REM ------------------------------------------------------------------------------------------

REM ------------------------------------------------------------------------------------------


REM Nacharbeiten (intern):


:ENDE

Echo.
Echo.
Echo. ENDE

If Exist %MELDUNG% 	Del %MELDUNG%
If Exist temp.txt	Del temp.txt


REM OPTIONAL

REM del %AUSGABEDATEI%

Echo.
PAUSE

exit
cls







Datei II: Ausfhrungsdatei MACHCOP.BAT





@ Echo off


REM MACHCOP.BAT
REM Nicht verndern

set ELEV=CCC


REM Vergleiche Dateien

Echo.    >> %AUSGABEDATEI%
chcp 1252 >NUL
Echo n | Comp /L  "%QUELLE%"	"%ZIEL%"  2> NUL


REM Echo N| Comp /L  "%QUELLE%"	"%ZIEL%"  >> %AUSGABEDATEI%   2> NUL

Echo Nachricht: | Comp /L  "%QUELLE%"	"%ZIEL%"  >> %AUSGABEDATEI%   2> NUL


REM FEHLERMELDUNG:


if errorlevel 1 set ELEV=AAA
if errorlevel 2 set ELEV=Dateien konnten nicht geffnet werden


if errorlevel 1 Echo  - - - ! NICHT IDENTISCH ! - - -
if errorlevel 1 Echo ^>^> Die Dateien sind NICHT IDENTISCH! ------------------ >> %AUSGABEDATEI%
if errorlevel 2 Echo ^>^> %ELEV%  >> %AUSGABEDATEI%

REM DATEI EIGENSCHAFTEN:


chcp 1252 >NUL
ECHO. >> %AUSGABEDATEI%
Echo  %QUELLE% >> %AUSGABEDATEI%

chcp 850 >NUL
REM FOR /F "delims=^"  %%A in ("%QUELLE%") DO Set FILENAME=%%~nxA
FOR %%A in ("%QUELLE%") DO Set FILENAME=%%~nxA

ECHO.

chcp 850 >NUL
DIR "%QUELLE%" | findstr /I /C:"%FILENAME%"	>> %AUSGABEDATEI%


ECHO.

chcp 1252 >NUL
ECHO. >> %AUSGABEDATEI%
Echo  %ZIEL% >> %AUSGABEDATEI%

chcp 850 >NUL
REM FOR /F "delims=^"  %%A in ("%ZIEL%") DO Set FILENAME=%%~nxA
FOR %%A in ("%ZIEL%") DO Set FILENAME=%%~nxA

ECHO.

chcp 850 >NUL
DIR "%ZIEL%" | findstr /I /C:"%FILENAME%"	>> %AUSGABEDATEI%


chcp 1252 >NUL
ECHO. >> %AUSGABEDATEI%


REM OPTIONEN:


IF %SCHALTER%==J GOTO MITR



:OHNER

REM Ohne /R - berschreibt keine schreibgeschtzten Dateien:
Echo Schreibgeschuetzte Zieldateien werden -nicht- ueberschrieben
chcp 1252 >NUL
Echo d | Xcopy  "%QUELLE%"	"%ZIEL%" /K /D /Y /H > %MELDUNG% 2>&1
GOTO MELDE


:MITR

REM MIT /R - berschreibt auch schreibgeschtzte Dateien:
Echo Schreibgeschuetzte Zieldateien werden mit ueberschrieben!
chcp 1252 >NUL
Echo d | Xcopy  "%QUELLE%"	"%ZIEL%" /K /D /Y /H /R > %MELDUNG% 2>&1
GOTO MELDE


:MELDE

if errorlevel 4 Echo ^>^> ACHTUNG Kopierfehler! Datei konnte nicht gelesen oder geschrieben werden  >> %AUSGABEDATEI%
SORT < %MELDUNG% > temp.txt
set /p MELDETEXT1=<temp.txt
SORT /R < %MELDUNG% > temp.txt
set /p MELDETEXT2=<temp.txt


Echo.

if "%ELEV%"=="AAA" (if "%MELDETEXT1%"==%SYSTEMMELDUNG11% (Echo ^>^> Die Zieldatei ist NEUER! >> %AUSGABEDATEI%))

REM set ELEV=CCC

Echo.    >> %AUSGABEDATEI%
Echo.

Echo %MELDETEXT1%
IF NOT "%MELDETEXT2%"=="%MELDETEXT1%" Echo %MELDETEXT2%
Echo %MELDETEXT1% >> %AUSGABEDATEI%
IF NOT "%MELDETEXT2%"=="%MELDETEXT1%" Echo %MELDETEXT2% >> %AUSGABEDATEI%
IF "%MELDETEXT2%"==%SYSTEMMELDUNG22% Echo Die Zieldatei ist mglicherweise schreibgeschtzt >> %AUSGABEDATEI%

Echo.    >> %AUSGABEDATEI%
if "%ELEV%"=="Dateien konnten nicht geffnet werden" (if EXIST "%QUELLE%" (if EXIST "%ZIEL%" (Echo - Die Quelldatei wurde neu ins Zielverzeichnis kopiert - >> %AUSGABEDATEI%)))
if "%ELEV%"=="Dateien konnten nicht geffnet werden" (if EXIST "%QUELLE%" (if EXIST "%ZIEL%" (Echo 1 Datei^(en^) kopiert >> %AUSGABEDATEI%)))

Echo.    >> %AUSGABEDATEI%
Echo ------------- >> %AUSGABEDATEI%
Echo.    >> %AUSGABEDATEI%
Echo.    >> %AUSGABEDATEI%

Echo.
Echo ----------
Echo.

REM Sicherung, da sonst bei Fehlern Quelle / Ziel bertragen werden:

SET QUELLE=""
SET ZIEL=""


REM ----------


