Batch xcopy - Quelle und Ziel zeilenweise aus txt-Dateien entnehmen
Hallo Zusammen,
ich komm gerade einfach nicht weiter...
Habe leider nichts passendes über die Suchfunktion oder Google gefunden.
Ich habe eine Batch-Datei, in der 2 Textdateien (TA & TB) erstellt werden, in denen sich Pfadangaben befinden.
(TA: M:\Ordner1\Ordner2 | TB: K:\Ordner3)
Mit xcopy würde ich gerne immer aus der TA die Quelle entnehmen und aus TB das Ziel.
Das ganze ist Zeilenweise aufgebaut werden, das heißt die 1.Quelle steht in TA in der 1.Zeile, das 1.Ziel steht in TB in der 1.Zeile.
Die 2.Quelle steht in TA in der 2.Zeile, das 2.Ziel steht in TB in Zeile 2 usw.
Es sollen alle Dateien kopiert und überschrieben werden, vorausgesetzt dass die vorhandene Dateien älter sind und die Dateien gleich groß sind.
Sollte die Datei nicht gleich Groß sein, soll die Datei fortlaufend umbenannt werden, d.h. wenn Datei ABC.txt bereits abliegt, dann soll die neue Datei als ABC_01.txt abgelegt werden.
Sollte nocheinmal eine Datei hinzukommen, die weder der Größe von ABC.txt oder ABC_01.txt hat, soll diese Datei in ABC_02 umbenannt werden usw.
Leider habe ich immer irgend einen Fehler in meinen Lösungen...
Hier mal einer meiner Versuche... (die Überprüfung auf Größe und die Umbenennung der Dateien sind mir gerade erst eingefallen, wäre nice-to-have aber nicht unbedingt nötig)
Schön wäre noch wenn die Kopiervorgänge mitgeloggt werden, aber das wäre wirklich nur ein Schönheitsfeature.
Vielleicht hat ja einer gerade den passenden Code-Schnipsel da, ich wäre für jede Hilfe dankbar.
Mit freundlichen Grüßen
Brother-Tuck
ich komm gerade einfach nicht weiter...
Habe leider nichts passendes über die Suchfunktion oder Google gefunden.
Ich habe eine Batch-Datei, in der 2 Textdateien (TA & TB) erstellt werden, in denen sich Pfadangaben befinden.
(TA: M:\Ordner1\Ordner2 | TB: K:\Ordner3)
Mit xcopy würde ich gerne immer aus der TA die Quelle entnehmen und aus TB das Ziel.
Das ganze ist Zeilenweise aufgebaut werden, das heißt die 1.Quelle steht in TA in der 1.Zeile, das 1.Ziel steht in TB in der 1.Zeile.
Die 2.Quelle steht in TA in der 2.Zeile, das 2.Ziel steht in TB in Zeile 2 usw.
Es sollen alle Dateien kopiert und überschrieben werden, vorausgesetzt dass die vorhandene Dateien älter sind und die Dateien gleich groß sind.
Sollte die Datei nicht gleich Groß sein, soll die Datei fortlaufend umbenannt werden, d.h. wenn Datei ABC.txt bereits abliegt, dann soll die neue Datei als ABC_01.txt abgelegt werden.
Sollte nocheinmal eine Datei hinzukommen, die weder der Größe von ABC.txt oder ABC_01.txt hat, soll diese Datei in ABC_02 umbenannt werden usw.
Leider habe ich immer irgend einen Fehler in meinen Lösungen...
Hier mal einer meiner Versuche... (die Überprüfung auf Größe und die Umbenennung der Dateien sind mir gerade erst eingefallen, wäre nice-to-have aber nicht unbedingt nötig)
for /f "delims=" %%m in ("K:\Abgleich\%Date%\Path_M_%Date%.txt") do (
for /f "delims=" %%k in ("K:\Abgleich\%Date%\Path_K_%Date%.txt") do (
xcopy "%%m" "%%k" /c /d /e /f /y >> K:\Abgleich\%Date%\Backup_%Date%.txt))
Schön wäre noch wenn die Kopiervorgänge mitgeloggt werden, aber das wäre wirklich nur ein Schönheitsfeature.
Vielleicht hat ja einer gerade den passenden Code-Schnipsel da, ich wäre für jede Hilfe dankbar.
Mit freundlichen Grüßen
Brother-Tuck
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Biber am 21.11.2013 um 23:18:26 Uhr
Zitat von @Brother-Tuck:
Wenn wir das ganze umbennenen auf max. 1 mal einschränken, wäre es dann einfacher?
Wenn wir das ganze umbennenen auf max. 1 mal einschränken, wäre es dann einfacher?
set /a rgc+=1
#884
Vielleich bekommen wir dieses Jahr noch die 888 hin...
Content-ID: 222368
Url: https://administrator.de/forum/batch-xcopy-quelle-und-ziel-zeilenweise-aus-txt-dateien-entnehmen-222368.html
Ausgedruckt am: 09.04.2025 um 16:04 Uhr
11 Kommentare
Neuester Kommentar
Hi, da hast du dir eine schöne Frage ausgesucht! Deshalb auch die zahlreichen Antworten 
lg.
@ECHO OFF &SETLOCAL
<TA.TXT (
FOR /F "delims=" %%a in (TB.TXT) do (
set "fname="
set /p "fname="
set "nname=%%a"
SETLOCAL ENABLEDELAYEDEXPANSION
if exist "!nname!" call:namecorr "!fname!" "!nname!" fname nname
echo(f|xcopy "!fname!" "!nname!" /cdfyl
endlocal
))
goto:eof
:namecorr "!fname!" "!nname!" fname nname
setlocal
set "nname=%~2"
for /f "delims=" %%a in ('dir /b /a-d /on "%~f2" "%~dpn2_??%~x2"') do (
for /f "delims=" %%b in ("%~dp2%%~a") do (
if not "%~z1"=="%%~zb" set "flag=true"
)
set "last=%%a"
)
if not defined flag goto:return
:loop
set /a cnt+=1
set "pfx=0%cnt%"
set "pfx=%pfx:~-2%"
set "last=%~dpn2_%pfx%%~x2"
if exist "%last%" goto:loop
set "nname=%last%"
:return
endlocal&set "%~3=%fname%"&set "%~4=%nname%"
exit /b
Zitat von @Brother-Tuck:
Der Inhalt der TXT-Dateien sieht wie folgt aus (ohne Quelle: und ohne Ziel:
):
Quelle: M:\ABCDEz_1234\KLM_006789
Ziel: K:\ABCDEz_1234KLM6789_Q-RST-4321_Z-RST-4321
Die Dateinamen heißen:
Quelle: K:\Abgleich\%Date%\Path_M_%Date%.txt
Ziel: K:\Abgleich\%Date%\Path_K_%Date%.txt
Vermutlich verstehe ich das nicht. Wie sollen die Dateinamen aus der Textdatei abgeleitet werden, wo doch die Pfade unterschiedlich sind?Der Inhalt der TXT-Dateien sieht wie folgt aus (ohne Quelle: und ohne Ziel:
Quelle: M:\ABCDEz_1234\KLM_006789
Ziel: K:\ABCDEz_1234KLM6789_Q-RST-4321_Z-RST-4321
Die Dateinamen heißen:
Quelle: K:\Abgleich\%Date%\Path_M_%Date%.txt
Ziel: K:\Abgleich\%Date%\Path_K_%Date%.txt
lg.
Ja, das ist klar soweit. Die Schwierigkeiten entstehen durch die "Suffixkinddateien" an die
Diese Suffixkinder führen letztlich auch dazu, dass vor dem Kopieren des Ordners mit xcopy viele Ausnahmen zeitraubend einzeln behandelt werden müssen. Xcopy ist ja keine Versionsverwaltung. Vielleicht unterstützt ein Archivierer so etwas.
lg.
_??
angehängt wurde. Wenn im Quellverzeichnis die Datei TEST.DAT
steht, die im Zielverzeichnis fehlt, dafür aber die Dateien TEST_01.DAT
und TEST_03.DAT
im Zielverzeichnis stehen, weiss ich nicht, welches die Zieldatei ist, von deren Eigenschaften das weitere Vorgehen abhängt.Diese Suffixkinder führen letztlich auch dazu, dass vor dem Kopieren des Ordners mit xcopy viele Ausnahmen zeitraubend einzeln behandelt werden müssen. Xcopy ist ja keine Versionsverwaltung. Vielleicht unterstützt ein Archivierer so etwas.
lg.
Hi, ich habs mal mit den von dir gewünschten Ausnahmen geschrieben. Beim Batch-Script-Schreiben befällt mich bisweilen das Gefühl, im Raumanzug umherzutapsen. Und wie jeder schlechte
Programmierer habe ich nichts kommentiert 
lg.
@ECHO OFF &SETLOCAL
set "tfileA=ta.txt"
set "tfileB=tb.txt"
for /f "tokens=1*delims=:" %%a in ('findstr /n $ "%tfileA%"') do set "$a%%a=%%b"&set /a foldersA=%%a
for /f "tokens=1*delims=:" %%a in ('findstr /n $ "%tfileB%"') do set "$b%%a=%%b"&set /a foldersB=%%a
if "%foldersA%"=="%foldersB%" (echo %foldersA% folder(s^) found in %tfileA%.) else echo Folder mismatch: %tfileA%:%foldersA% - %tfileB%:%foldersB%&goto:eof
:loopFd
set /a countFd+=1
call:folderchk "%%$a%countFd%%%"="%%$b%countFd%%%"
if %countFd% lss %foldersA% goto:loopFd
goto:eof
:folderchk
setlocal
set "tfileEx=%temp%\%random%.tmp%"
for /f "delims=" %%a in ("%tfileEx%") do set "tfileEx=%%~sa"
for %%a in ("%~1\*") do call:exceptionchk "%%~a" "%~2" "%tfileEx%"
set "cmdline=/dyl"
if exist "%tfileEx%" set "cmdline=%cmdline% /EXCLUDE:%tfileEx%"
xcopy "%~1" "%~2" %cmdline%
if exist "%tfileEx%" del "%tfileEx%"
endlocal
exit /b
:exceptionchk
setlocal
for /f "delims=" %%a in ('dir /b /a-d "%~2\%~nx1" "%~2\%~n1_???%~x1" 2^>nul') do set "last=%%~a"
if not defined last goto:return
for /f "delims=" %%a in ("%~2\%last%") do set "lastsize=%%~za"
if "%~nx1"=="%last%" if "%~z1"=="%lastsize%" goto:return
for /f "delims=" %%a in ("%last%") do set "pfx=%%~na"
for /f "tokens=*delims=0" %%a in ("%pfx:~-3%") do set /a sfx=%%~a 2>nul&&set /a sfx+=1||set /a sfx=1
if %sfx%==1 set "pfx=%~n1_000"
set "sfx=000%sfx%"
set "sfx=%sfx:~-3%"
set "nname=%pfx:~0,-3%%sfx%%~x1"
echo Exception: %~nx1 --^> %nname%
echo(f|xcopy /yl "%~1" "%~2\%nname%" >nul
>>"%~3" echo(%~1
:return
endlocal
exit /b