Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
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?
set /a rgc+=1
#884

Vielleich bekommen wir dieses Jahr noch die 888 hin...

Batch xcopy - Quelle und Ziel zeilenweise aus txt-Dateien entnehmen

Frage Entwicklung Batch & Shell

Mitglied: Brother-Tuck

Brother-Tuck (Level 1) - Jetzt verbinden

19.11.2013, aktualisiert 11:10 Uhr, 1574 Aufrufe, 11 Kommentare

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)

01.
for /f "delims=" %%m in ("K:\Abgleich\%Date%\Path_M_%Date%.txt") do ( 
02.
for /f "delims=" %%k in ("K:\Abgleich\%Date%\Path_K_%Date%.txt") do ( 
03.
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
Mitglied: Endoro
20.11.2013 um 00:07 Uhr
Hi, da hast du dir eine schöne Frage ausgesucht! Deshalb auch die zahlreichen Antworten
01.
@ECHO OFF &SETLOCAL 
02.
<TA.TXT ( 
03.
FOR /F "delims=" %%a in (TB.TXT) do ( 
04.
	set "fname=" 
05.
	set /p "fname=" 
06.
	set "nname=%%a" 
07.
	SETLOCAL ENABLEDELAYEDEXPANSION 
08.
	if exist "!nname!" call:namecorr "!fname!" "!nname!" fname nname 
09.
	echo(f|xcopy "!fname!" "!nname!" /cdfyl 
10.
	endlocal 
11.
)) 
12.
goto:eof 
13.
 
14.
:namecorr "!fname!" "!nname!" fname nname 
15.
setlocal 
16.
set "nname=%~2" 
17.
for /f "delims=" %%a in ('dir /b /a-d /on "%~f2" "%~dpn2_??%~x2"') do ( 
18.
	for /f "delims=" %%b in ("%~dp2%%~a") do ( 
19.
		if not "%~z1"=="%%~zb" set "flag=true" 
20.
21.
	set "last=%%a" 
22.
23.
if not defined flag goto:return 
24.
:loop 
25.
set /a cnt+=1 
26.
set "pfx=0%cnt%" 
27.
set "pfx=%pfx:~-2%" 
28.
set "last=%~dpn2_%pfx%%~x2" 
29.
if exist "%last%" goto:loop 
30.
set "nname=%last%" 
31.
:return  
32.
endlocal&set "%~3=%fname%"&set "%~4=%nname%" 
33.
exit /b
lg.
Bitte warten ..
Mitglied: Brother-Tuck
20.11.2013, aktualisiert um 10:19 Uhr
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: ):

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.
Bitte warten ..
Mitglied: Endoro
20.11.2013 um 12:56 Uhr
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?
lg.
Bitte warten ..
Mitglied: Brother-Tuck
20.11.2013, aktualisiert um 15:24 Uhr
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.
Bitte warten ..
Mitglied: Endoro
20.11.2013 um 18:45 Uhr
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.
Bitte warten ..
Mitglied: Brother-Tuck
21.11.2013, aktualisiert um 10:12 Uhr
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
Bitte warten ..
Mitglied: Endoro
21.11.2013, aktualisiert um 19:19 Uhr
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
01.
@ECHO OFF &SETLOCAL 
02.
set "tfileA=ta.txt" 
03.
set "tfileB=tb.txt" 
04.
 
05.
for /f "tokens=1*delims=:" %%a in ('findstr /n $ "%tfileA%"') do set "$a%%a=%%b"&set /a foldersA=%%a 
06.
for /f "tokens=1*delims=:" %%a in ('findstr /n $ "%tfileB%"') do set "$b%%a=%%b"&set /a foldersB=%%a 
07.
if "%foldersA%"=="%foldersB%" (echo %foldersA% folder(s^) found in %tfileA%.) else echo Folder mismatch: %tfileA%:%foldersA% - %tfileB%:%foldersB%&goto:eof 
08.
:loopFd 
09.
set /a countFd+=1 
10.
call:folderchk "%%$a%countFd%%%"="%%$b%countFd%%%" 
11.
if %countFd% lss %foldersA% goto:loopFd 
12.
goto:eof 
13.
 
14.
:folderchk 
15.
setlocal 
16.
set "tfileEx=%temp%\%random%.tmp%" 
17.
for /f "delims=" %%a in ("%tfileEx%") do set "tfileEx=%%~sa" 
18.
for %%a in ("%~1\*") do call:exceptionchk "%%~a" "%~2" "%tfileEx%" 
19.
set "cmdline=/dyl" 
20.
if exist "%tfileEx%" set "cmdline=%cmdline% /EXCLUDE:%tfileEx%" 
21.
xcopy "%~1" "%~2" %cmdline%  
22.
if exist "%tfileEx%" del "%tfileEx%" 
23.
endlocal 
24.
exit /b 
25.
 
26.
:exceptionchk 
27.
setlocal 
28.
for /f "delims=" %%a in ('dir /b /a-d "%~2\%~nx1" "%~2\%~n1_???%~x1" 2^>nul') do set "last=%%~a" 
29.
if not defined last goto:return 
30.
for /f "delims=" %%a in ("%~2\%last%") do set "lastsize=%%~za" 
31.
if "%~nx1"=="%last%" if "%~z1"=="%lastsize%" goto:return 
32.
for /f "delims=" %%a in ("%last%") do set "pfx=%%~na" 
33.
for /f "tokens=*delims=0" %%a in ("%pfx:~-3%") do set /a sfx=%%~a 2>nul&&set /a sfx+=1||set /a sfx=1  
34.
if %sfx%==1 set "pfx=%~n1_000" 
35.
set "sfx=000%sfx%" 
36.
set "sfx=%sfx:~-3%" 
37.
set "nname=%pfx:~0,-3%%sfx%%~x1" 
38.
echo Exception: %~nx1 --^> %nname% 
39.
echo(f|xcopy /yl "%~1" "%~2\%nname%" >nul 
40.
>>"%~3" echo(%~1 
41.
:return 
42.
endlocal 
43.
exit /b
lg.
Bitte warten ..
Mitglied: Brother-Tuck
25.11.2013 um 08:09 Uhr
Zitat von Endoro:

01.
> @ECHO OFF &SETLOCAL 
02.
> set "tfileA=ta.txt" 
03.
> set "tfileB=tb.txt" 
04.
>  
05.
> for /f "tokens=1*delims=:" %%a in ('findstr /n $ "%tfileA%"') do set "$a%%a=%%b"&set 
06.
> /a foldersA=%%a 
07.
> for /f "tokens=1*delims=:" %%a in ('findstr /n $ "%tfileB%"') do set "$b%%a=%%b"&set 
08.
> /a foldersB=%%a 
09.
> if "%foldersA%"=="%foldersB%" (echo %foldersA% folder(s^) found in %tfileA%.) else echo Folder mismatch: 
10.
> %tfileA%:%foldersA% - %tfileB%:%foldersB%&goto:eof 
11.
> :loopFd 
12.
> set /a countFd+=1 
13.
> call:folderchk "%%$a%countFd%%%"="%%$b%countFd%%%" 
14.
> if %countFd% lss %foldersA% goto:loopFd 
15.
> goto:eof 
16.
>  
17.
> :folderchk 
18.
> setlocal 
19.
> set "tfileEx=%temp%\%random%.tmp%" 
20.
> for /f "delims=" %%a in ("%tfileEx%") do set "tfileEx=%%~sa" 
21.
> for %%a in ("%~1\*") do call:exceptionchk "%%~a" "%~2" "%tfileEx%" 
22.
> set "cmdline=/dyl" 
23.
> if exist "%tfileEx%" set "cmdline=%cmdline% /EXCLUDE:%tfileEx%" 
24.
> xcopy "%~1" "%~2" %cmdline%  
25.
> if exist "%tfileEx%" del "%tfileEx%" 
26.
> endlocal 
27.
> exit /b 
28.
>  
29.
> :exceptionchk 
30.
> setlocal 
31.
> for /f "delims=" %%a in ('dir /b /a-d "%~2\%~nx1" "%~2\%~n1_???%~x1" 2^>nul') do set 
32.
> "last=%%~a" 
33.
> if not defined last goto:return 
34.
> for /f "delims=" %%a in ("%~2\%last%") do set "lastsize=%%~za" 
35.
> if "%~nx1"=="%last%" if "%~z1"=="%lastsize%" goto:return 
36.
> for /f "delims=" %%a in ("%last%") do set "pfx=%%~na" 
37.
> for /f "tokens=*delims=0" %%a in ("%pfx:~-3%") do set /a sfx=%%~a 2>nul&&set /a sfx+=1||set /a 
38.
> sfx=1  
39.
> if %sfx%==1 set "pfx=%~n1_000" 
40.
> set "sfx=000%sfx%" 
41.
> set "sfx=%sfx:~-3%" 
42.
> set "nname=%pfx:~0,-3%%sfx%%~x1" 
43.
> echo Exception: %~nx1 --^> %nname% 
44.
> echo(f|xcopy /yl "%~1" "%~2\%nname%" >nul 
45.
> >>"%~3" echo(%~1 
46.
> :return 
47.
> endlocal 
48.
> exit /b 
49.
> 

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.
Bitte warten ..
Mitglied: Endoro
25.11.2013 um 09:11 Uhr
Hey, zur Fehlersuche wäre es gut zu wissen, wo falsch hin kopiert wurde und wo es hingehört hätte.
lg.
Bitte warten ..
Mitglied: Brother-Tuck
25.11.2013, aktualisiert um 10:32 Uhr
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:

01.
5 Datei(en) kopiert 
02.
K:\TT_0023GGG4697_Q-_Z-LLL-1598\BB.pdf 
03.
1 Datei(en) kopiert 
04.
K:\TT_0023GGG2813_Q-LLL-1598_Z-LLL-1598\DSF.pdf 
05.
K:\TT_0023GGG2813_Q-LLL-1598_Z-LLL-1598\QR.pdf 
06.
2 Datei(en) kopiert 
07.
K:\TT_0023GGG2812_Q-_Z-LLL-1598\VA.pdf 
08.
K:\TT_0023GGG2812_Q-_Z-LLL-1598\DSHN.pdf 
09.
2 Datei(en) kopiert 
10.
0 Datei(en) kopiert 
11.
K:\TT_0023GGG2311_Q-LLL-1598_Z-LLL-1598\A.pdf 
12.
K:\TT_0023GGG2311_Q-LLL-1598_Z-LLL-1598\GDTN.pdf 
13.
2 Datei(en) kopiert 
14.
0 Datei(en) kopiert 
15.
0 Datei(en) kopiert 
16.
K:\TT_0023GGG3303_Q-LLL-1598_Z-LLL-1598\SG.pdf 
17.
1 Datei(en) kopiert 
18.
0 Datei(en) kopiert 
19.
0 Datei(en) kopiert 
20.
0 Datei(en) kopiert 
21.
K:\TT_0023GGG3836_Q-_Z-LLL-1598\BN.pdf 
22.
K:\TT_0023GGG3836_Q-_Z-LLL-1598\RJ.pdf 
23.
2 Datei(en) kopiert 
24.
0 Datei(en) kopiert 
25.
0 Datei(en) kopiert 
26.
K:\TT_0023GGG4627_Q-LLL-1598_Z-LLL-1598\TK.pdf 
27.
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...
Bitte warten ..
Mitglied: Endoro
28.11.2013 um 23:43 Uhr
Hey, dann schreib das doch in ein Logfile (Source folder, Destination folder, beabsichtigtes Zielverzeichnis).
lg.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...