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
GELÖST

Kopieren und aufteilen von Dateien anhand einer Dateiliste

Frage Entwicklung Batch & Shell

Mitglied: tHe-jAy

tHe-jAy (Level 1) - Jetzt verbinden

17.06.2008, aktualisiert 26.06.2008, 3977 Aufrufe, 7 Kommentare

Hallo,

ich sollte folgendes Problem lösen. Vorliegend ist eine Dateiliste mit ca 20.000 Zeilen die absoluten Pfad und Dateiname enthalten.

Bsp: \\192.168.0.1\Ablage\...\Projekt 1\Datei1.xyz

Die einzelnen Dateien möchte ich nun von verschiedenen Ablageorten an einen Ort kopieren. Dabei sollten Sie zu 100-Datei großen Paketen in entsprechende Unterverzeichnisse aufgeteilt werden.

Mein erster Ansatz wäre ne Batch gewesen die wie folgt ausgesehen hätte.


@echo off
cd\
cd "c:\xyz\"
md 000
copy "\\192.168.0.1\Ablage\...\Projekt 1\Datei1.xyz" "c:\xyz\000"
rem (das ganze dann mit den nächsten 99 Dateien entsprechend)

md 001
copy "\\192.168.0.1\Ablage\...\Projekt 1\Datei101.xyz" "c:\xyz\000"
rem (das ganze dann mit den nächsten 99 Dateien entsprechend)



Nachdem das kopieren nicht den gewünschten Erfolgt erbracht hatte, habe ich die einzelnen Befehle in der Befehlszeile und in der Eingabeaufforderung probiert, dort funktionierte das Kopieren der einzelnen Dateien wunderbar. Aber wenn ich dann 100 Dateien über die Batch versuche zu kopieren, klappts wieder nicht.

Bsp:
@echo off
copy "\\192.168.0.1\Ablage\...\Projekt 1\Datei1.xyz" "c:\xyz\000"
copy "\\192.168.0.1\Ablage\...\Projekt 1\Datei2.xyz" "c:\xyz\000"
copy "\\192.168.0.1\Ablage\...\Projekt 1\Datei3.xyz" "c:\xyz\000"
...
copy "\\192.168.0.1\Ablage\...\Projekt 1\Datei4.xyz" "c:\xyz\000"



Wo liegt das Problem? Welchen schöneren Ansatz gäbe es? Immerhin hätte ich ne filelist.txt mit allen Einträgen.

Danke schon ma
Mitglied: bastla
17.06.2008 um 10:48 Uhr
Hallo tHe-jAy und willkommen im Forum!

Das könnte (ungetestet) so gehen:
01.
@echo off & setlocal 
02.
set "Liste=D:\Deine Liste.txt" 
03.
set "Ziel=C:\xyz" 
04.
set /a Anzahl=100 
05.
 
06.
set /a OrdnerNr=999 
07.
set /a DateiNr=%Anzahl% 
08.
 
09.
for /f "usebackq delims=" %%i in ("%Liste%") do call :ProcessFile "%%i" 
10.
goto :eof 
11.
 
12.
:ProcessFile 
13.
if %DateiNr% lss %Anzahl% goto :Kopieren 
14.
set /a DateiNr=0 
15.
set /a OrdnerNr+=1 
16.
if not exist "%Ziel%\%OrdnerNr:~-3%" md "%Ziel%\%OrdnerNr:~-3%" 
17.
 
18.
:Kopieren 
19.
set /a DateiNr+=1 
20.
copy %1 "%Ziel%\%OrdnerNr:~-3%\" >nul 
21.
goto :eof
Sollte übrigens eine gleichnamige Datei im Zielordner bereits existieren, wird diese kommentarlos überschrieben.

Grüße
bastla

[Edit] Variablennamen %DateiNr% und %OrdnerNr% vereinheitlicht [/Edit]
Bitte warten ..
Mitglied: tHe-jAy
17.06.2008 um 12:20 Uhr
Vielen Dank für die schnelle antwort. Hab das auf die schnelle mal ausprobiert (entsprechendes angepasst), leider jedoch ohne erfolg. Der Inhalt übersteigt momentan auch noch mein Wissen, aber ich werde versuchen mich mal komplett durchzuarbeiten. Vorstellen kann ich mir schon was wann wo realisiert wird, trotzdem möcht ichs auch ganz verstehen ;)

Im Moment sieht es leider so aus, dass die Liste nicht verarbeitet wird. Zu Testzwecken hab ich mir ne kleiner Filelist erstellt (auch alles Lokal) aber leider trotzdem ohne Erfolg.

Vielleicht später näheres wenn ich Zeit gefunden hab mich durch den Code zu arbeiten.


Mit freundlichen Grüßen
Bitte warten ..
Mitglied: tHe-jAy
25.06.2008 um 12:49 Uhr
Leider passiert nichts, auch nicht nach mehrmaligem testen.

01.
@echo off & setlocal 
02.
set "Liste=C:\Temp\filelist1.txt" 
03.
set "Ziel=C:\Temp\Daten" 
04.
set /a Anzahl=2 
05.
 
06.
set /a OrdnerNr=999 
07.
set /a DateiNr=%Anzahl% 
08.
 
09.
for /f "usebackq delims=" %%i in ("%Liste%") do call :ProcessFile "%%i" 
10.
goto :eof 
11.
 
12.
:ProcessFile 
13.
if %DateiNr% lss %Anzahl% goto :Kopieren 
14.
set /a DateiNr=0 
15.
set /a OrdnerNr+=1 
16.
if not exist "%Ziel%\%OrdnerNr:~-3%" md "%Ziel%\%OrdnerNr:~-3%" 
17.
 
18.
:Kopieren 
19.
set /a DateiNr+=1 
20.
copy %1 "%Ziel%\%OrdnerNr:~-3%\" >nul 
21.
goto :eof

der Inhalt der filelist1.txt sieht wie folgt aus:

01.
"C:\Temp\files\01.txt" 
02.
"C:\Temp\files\02.txt" 
03.
"C:\Temp\files\03.txt" 
04.
"C:\Temp\files\04.txt"

angezeigt wird folgendes bei "@echo on":
01.
C:\Temp>set "Liste=C:\Temp\filelist1.txt" 
02.
C:\Temp>set "Ziel=C:\Temp\Daten" 
03.
C:\Temp>set /a Anzahl=2 
04.
 
05.
C:\Temp>set /a OrdnerNr=999 
06.
C:\Temp>set /a DateiNr=%Anzahl% 
07.
 
08.
C:\Temp>for /f "usebackq delims=" %i in ("C:\Temp\filelist1.txt") do call :ProcessFile "%i" 
09.
C:\Temp>goto :eof
Mach ich nu irgendwas falsch oder steh ich total aufm schlauch?
Bitte warten ..
Mitglied: bastla
25.06.2008 um 14:27 Uhr
Hallo tHe-jAy!

Bei mir sieht das (mit Deinem Beispiel oben, aber mit "@echo off") so aus:
01.
C:\temp>dir /s /b 
02.
C:\temp\filelist1.txt 
03.
C:\temp\files 
04.
C:\temp\Verteilen.cmd 
05.
C:\temp\files\01.txt 
06.
C:\temp\files\02.txt 
07.
C:\temp\files\03.txt 
08.
C:\temp\files\04.txt 
09.
 
10.
C:\temp>type filelist1.txt 
11.
"C:\Temp\files\01.txt" 
12.
"C:\Temp\files\02.txt" 
13.
"C:\Temp\files\03.txt" 
14.
"C:\Temp\files\04.txt" 
15.
C:\temp>type Verteilen.cmd 
16.
@echo off & setlocal 
17.
set "Liste=C:\Temp\filelist1.txt" 
18.
set "Ziel=C:\Temp\Daten" 
19.
set /a Anzahl=2 
20.
 
21.
set /a OrdnerNr=999 
22.
set /a DateiNr=%Anzahl% 
23.
 
24.
for /f "usebackq delims=" %%i in ("%Liste%") do call :ProcessFile "%%i" 
25.
goto :eof 
26.
 
27.
:ProcessFile 
28.
if %DateiNr% lss %Anzahl% goto :Kopieren 
29.
set /a DateiNr=0 
30.
set /a OrdnerNr+=1 
31.
if not exist "%Ziel%\%OrdnerNr:~-3%" md "%Ziel%\%OrdnerNr:~-3%" 
32.
 
33.
:Kopieren 
34.
set /a DateiNr+=1 
35.
copy %1 "%Ziel%\%OrdnerNr:~-3%\" >nul 
36.
goto :eof 
37.
C:\temp>verteilen 
38.
 
39.
C:\temp>dir /s /b 
40.
C:\temp\Daten 
41.
C:\temp\filelist1.txt 
42.
C:\temp\files 
43.
C:\temp\Verteilen.cmd 
44.
C:\temp\Daten\000 
45.
C:\temp\Daten\001 
46.
C:\temp\Daten\000\01.txt 
47.
C:\temp\Daten\000\02.txt 
48.
C:\temp\Daten\001\03.txt 
49.
C:\temp\Daten\001\04.txt 
50.
C:\temp\files\01.txt 
51.
C:\temp\files\02.txt 
52.
C:\temp\files\03.txt 
53.
C:\temp\files\04.txt 
54.
 
55.
C:\temp>
Mit eingeschaltetem "echo":
01.
C:\temp>set "Liste=C:\Temp\filelist1.txt"  
02.
 
03.
C:\temp>set "Ziel=C:\Temp\Daten"  
04.
 
05.
C:\temp>set /a Anzahl=2  
06.
 
07.
C:\temp>set /a OrdnerNr=999  
08.
 
09.
C:\temp>set /a DateiNr=2  
10.
 
11.
C:\temp>for /F "usebackq delims=" %i in ("C:\Temp\filelist1.txt") do call :ProcessFile "%i"  
12.
 
13.
C:\temp>call :ProcessFile ""C:\Temp\files\01.txt""  
14.
 
15.
C:\temp>if 2 LSS 2 goto :Kopieren  
16.
 
17.
C:\temp>set /a DateiNr=0  
18.
 
19.
C:\temp>set /a OrdnerNr+=1  
20.
 
21.
C:\temp>if not exist "C:\Temp\Daten\000" md "C:\Temp\Daten\000"  
22.
 
23.
C:\temp>set /a DateiNr+=1  
24.
 
25.
C:\temp>copy ""C:\Temp\files\01.txt"" "C:\Temp\Daten\000\"  1>nul  
26.
 
27.
C:\temp>goto :eof  
28.
 
29.
C:\temp>call :ProcessFile ""C:\Temp\files\02.txt""  
30.
 
31.
C:\temp>if 1 LSS 2 goto :Kopieren  
32.
 
33.
C:\temp>set /a DateiNr+=1  
34.
 
35.
C:\temp>copy ""C:\Temp\files\02.txt"" "C:\Temp\Daten\000\"  1>nul  
36.
 
37.
C:\temp>goto :eof  
38.
 
39.
C:\temp>call :ProcessFile ""C:\Temp\files\03.txt""  
40.
 
41.
C:\temp>if 2 LSS 2 goto :Kopieren  
42.
 
43.
C:\temp>set /a DateiNr=0  
44.
 
45.
C:\temp>set /a OrdnerNr+=1  
46.
 
47.
C:\temp>if not exist "C:\Temp\Daten\001" md "C:\Temp\Daten\001"  
48.
 
49.
C:\temp>set /a DateiNr+=1  
50.
 
51.
C:\temp>copy ""C:\Temp\files\03.txt"" "C:\Temp\Daten\001\"  1>nul  
52.
 
53.
C:\temp>goto :eof  
54.
 
55.
C:\temp>call :ProcessFile ""C:\Temp\files\04.txt""  
56.
 
57.
C:\temp>if 1 LSS 2 goto :Kopieren  
58.
 
59.
C:\temp>set /a DateiNr+=1  
60.
 
61.
C:\temp>copy ""C:\Temp\files\04.txt"" "C:\Temp\Daten\001\"  1>nul  
62.
 
63.
C:\temp>goto :eof  
64.
 
65.
C:\temp>goto :eof 
Wie zu erkennen, stören auch die doppelten Anführungszeichen nicht. Um diese aber dennoch zu vermeiden:
01.
for /f "usebackq delims=" %%i in ("%Liste%") do call :ProcessFile "%%~i"
Das Problem scheint Deine Liste zu sein - diese wird zwar gefunden (ansonsten bekämst Du eine entsprechende Fehlermeldung), es werden aber keine Inhalte gelesen; eine Begründung dafür kann ich allerdings auch nicht bieten.

Was mich etwas irritiert, ist die Zeile 6 Deiner "echo"-Zeilen
01.
C:\Temp>set /a DateiNr=%Anzahl% 
%Anzahl% sollte eigentlich zu "2" aufgelöst werden (siehe bei mir Zeile 9).

Grüße
bastla
Bitte warten ..
Mitglied: tHe-jAy
26.06.2008 um 11:51 Uhr
Hallo Bastla,

nach ein paar mehr Versuchen hat es nun geklappt. So wie es aussieht liegt es daran, das meine originale Filelist als Unicode-Format gespeichert ist. Im ANSI-Format bzw. UTF-8-Format funktioniert es tadellos.

Wäre dies die Erklärung? Falls dies so ist, hab ich ein Problem mit Dateinamen, die Umlaute o.ä. enthalten, denn diese werden nicht korrekt verarbeitet.


Ansonsten wie gesagt, funktioniert es tadellos. Dafür auch herzlichen Dank
Bitte warten ..
Mitglied: bastla
26.06.2008 um 12:05 Uhr
Hallo tHe-jAy!

... Unicode-Format ... Wäre dies die Erklärung?
Zumindest hätte ich keine bessere Idee ...

... Problem mit Dateinamen, die Umlaute o.ä. enthalten
Versuch es mit folgendem Ersatz für die Zeile 9:
01.
for /f "tokens=2 delims=:." %%i in ('chcp') do set "cp=%%i" 
02.
chcp 1252>nul 
03.
for /f "usebackq delims=" %%i in ("%Liste%") do call :ProcessFile "%%i"  
04.
chcp %cp%>nul
Damit wird die aktuelle Codepage (zB 850) ausgelesen und zwischengespeichert, dann auf CP 1252 gewechselt, und nach der Verarbeitung wieder der ursprüngliche Wert gesetzt.

Falls das noch nicht genügen sollte, dann vielleicht noch diese Variante (ebenfalls als Ersatz der - einzelnen - Zeile 9):
01.
for /f "tokens=2 delims=:." %%i in ('chcp') do set "cp=%%i" 
02.
type "%Liste%">%temp%\Liste.txt 
03.
chcp 1252>nul 
04.
for /f "usebackq delims=" %%i in ("%temp%\Liste.txt") do call :ProcessFile "%%i" 
05.
del %temp%\Liste.txt 
06.
chcp %cp%>nul
Grüße
bastla
Bitte warten ..
Mitglied: tHe-jAy
26.06.2008 um 12:51 Uhr
Was soll ich jetzt noch sagen... außer

01.
@echo off 
02.
cls 
03.
echo. 
04.
echo. 
05.
echo. 
06.
echo. 
07.
echo                  Vielen herzlichen Danke 
08.
echo                  fr die perfekte Hilfe! 
09.
echo. 
10.
echo. 
11.
echo. 
12.
echo. 
13.
pause 
14.
exit
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
USB - Autorun kopieren von Dateien (6)

Frage von draycon zum Thema Batch & Shell ...

C und C++
Dateien in Ordner kopieren anhand vom Teil eines Dateinamen (22)

Frage von onlyforu8373 zum Thema C und C ...

Batch & Shell
Dateien kopieren die nicht mehr verändert werden? (10)

Frage von pbelcl zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...