Top-Themen

Aktuelle Themen (A bis Z)

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, 4037 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.


mfg
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 ..
Ähnliche Inhalte
Batch & Shell
Lange Dateiliste auf mehrere "kleine" Dateilisten aufteilen
gelöst Frage von tHe-jAyBatch & Shell4 Kommentare

Hallo, für eine weitere Verarbeitung muss ich eine Dateiliste mit knapp 100000 Zeilen in mehrere kleine aufteilen. Die Eingabeliste ...

Netzwerkgrundlagen
Netz aufteilen
gelöst Frage von FirebeatNetzwerkgrundlagen4 Kommentare

Guten Tag, Ich haben 10 PC's an einen Switch welche im IP-Netz 192.168.0.1/24, Gateway: 192.168.0.254 liegen und Internetzugriff über ...

Microsoft
Dateien kopieren
gelöst Frage von alex53842Microsoft2 Kommentare

Hallo zusammen, wir haben hier ein sehr tolles Phänomen. Eines unserer Dokumentenarchive hat einen kleinen Fehler. Es wurde eingerichtet ...

LAN, WAN, Wireless
Schulnetzwerk aufteilen
gelöst Frage von nmsbadhallLAN, WAN, Wireless28 Kommentare

Hallo! Nachdem unser Schulnetzwerk ständig erweitert und erweitert wurde möchte ich das Netzwerk - falls es sinnvoll ist, neu ...

Neue Wissensbeiträge
Datenschutz

Weitere Inforamtionen zum Sicherheitsproblem BeA

Information von Penny.Cilin vor 5 StundenDatenschutz

Im folgenden ein weiterer Bericht über die Sicherheitsprobleme von Bea. Fataler Konstruktionsfehler im besonderen elektronischen Anwaltspostfach Gruss Penny

Windows 10

Systemdienste behalten nach Win10 inplace-Upgrade nicht die ggf. modifizierte Startart bei

Tipp von DerWoWusste vor 7 StundenWindows 103 Kommentare

Stellt Euch vor, Ihr habt ein Win10 System und modifiziert dort die Startart von Systemdiensten. Zum Beispiel wollt Ihr ...

Microsoft Office

Deaktivieren von Startbildschirm und Backstage-Ansicht in Office 2016 per Batch-Datei

Anleitung von SarekHL vor 10 StundenMicrosoft Office17 Kommentare

Guten Morgen zusammen! Ich habe mir gestern (auch mit Hilfe dieses Boards) ein Script gebastelt, um in Office 2016 ...

Erkennung und -Abwehr

Sicherheitslücke Spectre und Meltdown: Status prüfen

Anleitung von Frank vor 16 StundenErkennung und -Abwehr2 Kommentare

Nach all den Updates der letzten Woche sollte man unbedingt auch den Status prüfen, ob die Sicherheitslücken Spectre, Meltdown ...

Heiß diskutierte Inhalte
Netzwerke
NTFS-Berechtigung
Frage von Daoudi1973Netzwerke23 Kommentare

Hallo zusammen und frohes neues Jahr (Sorry, ich bin spät dran) Meine Frage: 1- Ich habe einen Ordner im ...

Batch & Shell
AD-Abfrage in Batchdatei und Ergebnis als Variable verarbeiten
gelöst Frage von Winfried-HHBatch & Shell19 Kommentare

Hallo in die Runde! Ich habe eine Ergänzungsfrage zu einem alten Thread von mir. Ausgangslage ist die Batchdatei, die ...

Microsoft Office
Deaktivieren von Startbildschirm und Backstage-Ansicht in Office 2016 per Batch-Datei
Anleitung von SarekHLMicrosoft Office17 Kommentare

Guten Morgen zusammen! Ich habe mir gestern (auch mit Hilfe dieses Boards) ein Script gebastelt, um in Office 2016 ...

Windows 10
Netbook erkennt Soundkarte nicht - keinerlei Info zum Hersteller und Modell vom Netbook und Hardware bekannt
Frage von fyrb38Windows 1017 Kommentare

Guten Tag, meine Schwester reist in einigen Wochen für ein paar Monate ins Ausland und hat sich dafür ein ...