brother-tuck
Goto Top

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)

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
Kommentar vom Moderator Biber am Nov 21, 2013 um 22:18:26 Uhr
Zitat von @Brother-Tuck:

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-Key: 222368

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

Printed on: April 19, 2024 at 04:04 o'clock

Member: Endoro
Endoro Nov 19, 2013 at 23:07:50 (UTC)
Goto Top
Hi, da hast du dir eine schöne Frage ausgesucht! Deshalb auch die zahlreichen Antworten face-smile
@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
lg.
Member: Brother-Tuck
Brother-Tuck Nov 20, 2013 updated at 09:19:49 (UTC)
Goto Top
Erstmal vielen Dank für deine Mühe, Endoro.

Leider passiert bei mir nichts... ich habe das @echo off mal entfernt, aber wirklich mehr Informationen habe ich leider nicht bekommen...

Der Inhalt der TXT-Dateien sieht wie folgt aus (ohne Quelle: und ohne Ziel: face-smile ):

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

Alle Dateien in %Quelle% in den Ordner %Ziel% kopieren, unter den oben genannten Kriterien.
Ich blicke bei deinem Code leider nicht durch, deshalb kann ich daran leider kaum etwas verändern.
Wäre super, wenn du mir nochmal helfen könntest, vielen Dank.
Member: Endoro
Endoro Nov 20, 2013 at 11:56:56 (UTC)
Goto Top
Zitat von @Brother-Tuck:
Der Inhalt der TXT-Dateien sieht wie folgt aus (ohne Quelle: und ohne Ziel: face-smile ):

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?
lg.
Member: Brother-Tuck
Brother-Tuck Nov 20, 2013 updated at 14:24:41 (UTC)
Goto Top
Der Ordner wo die Skripte liegen und die TXT-Dateien gespeichert werden heist Abgleich, hat sonst keine Relevanz.
An sich gleicht das Backup halt die Daten zueinander ab, unter M:\ werden neue Daten angeliefert, die für mehrere Parteien gelten.
Am Ziel, unter K:\ werden die Daten gespeichert, welche Relevant sind.
Member: Endoro
Endoro Nov 20, 2013 at 17:45:49 (UTC)
Goto Top
Ja, das ist klar soweit. Die Schwierigkeiten entstehen durch die "Suffixkinddateien" an die _?? 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.
Member: Brother-Tuck
Brother-Tuck Nov 21, 2013 updated at 09:12:54 (UTC)
Goto Top
Habe ich verstanden.

Wenn wir das ganze umbennenen auf max. 1 mal einschränken, wäre es dann einfacher?
Also nur jede 1.Datei mit Identischem Dateinamen vergleichen und falls diese nicht in ihrer Größe übereinstimmen, umbenennen (_001 usw.) und kopieren?

Mir geht es vor allem darum das die beiden Txt-Dateien als Quelle für Quell- und Ziellokation verwendet werden.
TA.txt als Quelle und TB.txt als Ziel und das halt Zeilenweise, wie im ersten Post beschrieben, danke.
Das mit den doppelten Dateien, kann ich auch noch irgendwie anders lösen und wenn ich wöchentlich nen Backup machen muss... (rund 100MB Gesamtdaten)

Gruß Brother-Tuck
Member: Endoro
Endoro Nov 21, 2013 updated at 18:19:18 (UTC)
Goto Top
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 face-wink Programmierer habe ich nichts kommentiert face-sad
@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
lg.
Member: Brother-Tuck
Brother-Tuck Nov 25, 2013 at 07:09:32 (UTC)
Goto Top
Zitat von @Endoro:

> @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
> 

Sorry, bin leider erst jetzt dazu gekommen dein Skript zu Testen.
Also an sich funktioniert es... das Logfile sagt das er mehrere Dateien kopiert hat.
Leider nicht an den entsprechenden Zielordner...
Ich habe TA.txt mit TB.txt mal getauscht, leider das gleiche Problem.
Habe auch die Pfade abgeändert und unter Laufwerk C: dein Skript getestet, leider ohne Erfolg...
Wäre super falls du nochmal drüber schauen könntest.
Aber auf jeden Fall schonmal vielen Dank für deine Bemühungen.
Member: Endoro
Endoro Nov 25, 2013 at 08:11:45 (UTC)
Goto Top
Hey, zur Fehlersuche wäre es gut zu wissen, wo falsch hin kopiert wurde und wo es hingehört hätte.
lg.
Member: Brother-Tuck
Brother-Tuck Nov 25, 2013 updated at 09:32:30 (UTC)
Goto Top
Zitat von @Endoro:

Hey, zur Fehlersuche wäre es gut zu wissen, wo falsch hin kopiert wurde und wo es hingehört hätte.
lg.

Das ist richtig, aber leider weis ich das ja nicht.^^
Wo es hin gehört hätte, wäre ja das Verzeichnis in TB.txt.
Ich kann die Dateien leider nicht finden, wenn ich aber hinter Zeile 24 deines Skriptes ein Logfile setze, sagt er mir das er Dateien kopiert hat...

Das sieht dann so aus:

5 Datei(en) kopiert
K:\TT_0023GGG4697_Q-_Z-LLL-1598\BB.pdf
1 Datei(en) kopiert
K:\TT_0023GGG2813_Q-LLL-1598_Z-LLL-1598\DSF.pdf
K:\TT_0023GGG2813_Q-LLL-1598_Z-LLL-1598\QR.pdf
2 Datei(en) kopiert
K:\TT_0023GGG2812_Q-_Z-LLL-1598\VA.pdf
K:\TT_0023GGG2812_Q-_Z-LLL-1598\DSHN.pdf
2 Datei(en) kopiert
0 Datei(en) kopiert
K:\TT_0023GGG2311_Q-LLL-1598_Z-LLL-1598\A.pdf
K:\TT_0023GGG2311_Q-LLL-1598_Z-LLL-1598\GDTN.pdf
2 Datei(en) kopiert
0 Datei(en) kopiert
0 Datei(en) kopiert
K:\TT_0023GGG3303_Q-LLL-1598_Z-LLL-1598\SG.pdf
1 Datei(en) kopiert
0 Datei(en) kopiert
0 Datei(en) kopiert
0 Datei(en) kopiert
K:\TT_0023GGG3836_Q-_Z-LLL-1598\BN.pdf
K:\TT_0023GGG3836_Q-_Z-LLL-1598\RJ.pdf
2 Datei(en) kopiert
0 Datei(en) kopiert
0 Datei(en) kopiert
K:\TT_0023GGG4627_Q-LLL-1598_Z-LLL-1598\TK.pdf
1 Datei(en) kopiert

Wohin diese Dateien geschrieben wurden, kann ich leider nicht sagen... Bei meinem letzten lokalen Suchvorgang wurde leider nichts gefunden.
Die Netzlaufwerke sind leider zu Groß als das ich Sie an einem Tag durchsuchen könnte...
Member: Endoro
Endoro Nov 28, 2013 at 22:43:59 (UTC)
Goto Top
Hey, dann schreib das doch in ein Logfile (Source folder, Destination folder, beabsichtigtes Zielverzeichnis).
lg.