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

Dateien aus Unterverzeichnissen in einen Ordner verschieben - mit Batch?

Frage Entwicklung Batch & Shell

Mitglied: obi134

obi134 (Level 1) - Jetzt verbinden

15.10.2009 um 19:03 Uhr, 6536 Aufrufe, 11 Kommentare

Hi ihr Batch- Bastler unter euch
Ich habe leider überhaupt keine Ahnung von Batch- Dateien und bitte somit um eure fachkundige Hilfe!

Ich bin auf der Suche nach einer Batch, die Dateien aus einem Verzeichnis "flach" in einen Ordner packt. Also aus einem Verzeichnis mit mehreren Unterverzeichnissen in einen zentralen Ordner. Ich habe schon

Dateien verschieben und umbenennen mit Batch

gefunden, kann damit aber nicht so viel anfangen. Außerdem habe ich auch

c't - Dateien aus Unterverzeichnissen zusammenführen

gefunden, was die Dateien wohl kopiert, aber nicht verschiebt (Ich hoffe die Links sind sowas wie die gemeinten erlaubten Zusatzverlinkungen, ansonsten ist das nicht böse gemeint).
Bei mir ist das Problem, dass die vielen Bilder teilweise auch gleich heißen und ich nicht ganz nachvollziehen kann, welche er von den über 1000 Dateien kopiert hat und welche ich mit "n" vor dem überschreiben geschützt habe.
Meinetwegen können in dem Zielverzeichnis auch alle "bild1.jpg", "bild2.jpg" usw. heißen.
Die Lösung von Heise, dass man in die Batch in der Eingabeaufforderung mit den entsprechenden Parametern aufrufen kann, finde ich sehr gut und universell. Vielleicht wäre soetwas auch möglich? Eventuell auch noch mit dem Zusatz, wie der Präfix der entsprechenden Zieldateien sein soll z.B. "bild" oder "foto"?

Ich hoffe ich habe mich verständlich ausgedrückt. Ansonsten bitte rückfragen.
Könntet Ihr mir bitte helfen?

Gruß
Tobias
Mitglied: bastla
15.10.2009 um 19:28 Uhr
Hallo obi134 und willkommen im Forum!

Wenn's tatsächlich nur darum geht, alle Bilder (eines bestimmten Dateityps) mit fortlaufender Nummerierung in einem Ordner zu sammeln, könnte das Gerüst etwa so aussehen:
01.
@echo off & setlocal 
02.
set "Sammel=D:\Sammelordner" 
03.
set "Quelle=D:\Quellordner" 
04.
set "Prae=bild" 
05.
set "Typ=jpg" 
06.
 
07.
set /a Nr=1000001 
08.
 
09.
for /r "%Quelle%" %%i in (*.%Typ%) do call :ProcessFile "%%i" 
10.
goto :eof 
11.
 
12.
:ProcessFile 
13.
move %1 "%Sammel%\%Prae%%Nr:~-5%.%Typ%" 
14.
set /a Nr+=1 
15.
goto :eof
Wenn Du eine Parameterübergabe dem Anpassen der Zeilen 2 bis 5 vorziehst, kannst Du diese Zeilen etwa so schreiben:
01.
set "Sammel=%~1" 
02.
set "Quelle=%~2" 
03.
...
Allerdings solltst Du dann eine Prüfung der Parameter auf Vollzähligkeit ergänzen (als Vorlage dafür kann zB das verlinkte c't-Script dienen). Auch Existenz von Quell- und Zielordner wären zu prüfen (bzw letzterer ggf zu erstellen).

Der Inhalt des Zielordners wird ebenfalls vorweg nicht geprüft, sodass also Dateien mit dem selben Präfix (kommentarlos) überschrieben würden ...

Falls die führenden Nullen der laufenden Nummer nicht gewünscht wären, müsstest Du
move %1 "%Sammel%\%Prae%%Nr:~-5%.%Typ%"
durch
move %1 "%Sammel%\%Prae%%Nr%.%Typ%"
ersetzen. (Die Schreibweise mit .%Typ% anstelle von %~x1 hat übrigens den Sinn, eine einheitliche Schreibweise - hinsichtlich Groß-/Kleinschreibung - zu errreichen.)

Grüße
bastla

P.S.:
... welche ich mit "n" vor dem überschreiben geschützt habe.
habe ich nicht verstanden und daher auch nicht berücksichtigt.
Bitte warten ..
Mitglied: obi134
15.10.2009 um 20:04 Uhr
Hi bastla!
Danke für deine superschnelle Antwort!
Ich werde mich morgen, ansonsten nächstes Wochenende mal daran setzen, das Skript zu testen und anzupassen.
Ich werde dann mal das mit der Übergabe ausprobieren und dann die Überprüfung der Parameter, sowie die Prüfung des Zielordners hinzufügen, wenn ich das hinbekomme

mit "n" meinte ich folgendes:
Bei dem Kopieren war eine Datei schon vorhanden. Ich hatte die Option /y weggelassen, um gefragt zu werden (ja/nein/alle) und diese habe ich alle mit n beantwortet, um keine Datei zu überschreiben.
Schönen Abend noch!

Gruß
Tobias

Edit:
Außerdem probiere ich noch das mit den Leerzeichen im Dateinamen zu managen
Bitte warten ..
Mitglied: bastla
15.10.2009 um 20:47 Uhr
Hallo obi134!

Nur zur Sicherheit: Im Entwurf oben wird verschoben und ggf ohne Rückfrage überschrieben - um das zu vermeiden, müsstest Du dem move ein explizites /-Y hinzufügen!
Außerdem probiere ich noch das mit den Leerzeichen im Dateinamen zu managen
Leerzeichen (egal, ob bereits vorhandene oder ev hinzuzufügende) sollten in meinem Vorschlag nicht zu Problemen führen, da alle Dateinamen/Pfade unter Anführungszeichen stehen.

Grüße
bastla
Bitte warten ..
Mitglied: obi134
15.10.2009 um 21:16 Uhr
Hi bastla!
Ich habe mich gerade doch noch etwas an das File gesetzt.
Bin so weit gekommen:

01.
 
02.
@echo off & setlocal 
03.
 
04.
if %2. == . ( 
05.
  echo Nicht genug Parameter.  
06.
  echo Aufruf:   %~n0 ^<Quelle^> ^<Ziel^> [Maske] Präfix 
07.
  echo Beispiel: %~n0 c:\Bilder d:\Backup *.jpg bild 
08.
  echo           Kopiert alle *.jpg-Dateien aus c:\Bilder und Unterordnern "flach" 
09.
  echo           nach d:\Backup. Ist [Maske] nicht angegeben, werden alle Dateien 
10.
  echo           kopiert. Präfix gibt den Datei- Präfix an. 
11.
  exit /b 
12.
13.
 
14.
if %4. == . ( 
15.
  echo Nicht genug Parameter. 
16.
  echo Aufruf:   %~n0 ^<Quelle^> ^<Ziel^> [Maske] Präfix 
17.
  echo Beispiel: %~n0 c:\Bilder d:\Backup *.jpg bild 
18.
  echo           Kopiert alle *.jpg-Dateien aus c:\Bilder und Unterordnern "flach" 
19.
  echo           nach d:\Backup. Ist [Maske] nicht angegeben, werden alle Dateien 
20.
  echo           kopiert. Präfix gibt den Datei- Präfix an. 
21.
  exit /b 
22.
23.
 
24.
set "Quelle=%~1" 
25.
set "Sammel=%~2" 
26.
set "Typ=%3" 
27.
set "Prae=%4" 
28.
set /a Nr=00001 
29.
 
30.
if %Typ%. == . ( 
31.
  set "Typ=*" 
32.
  echo Es werden alle Dateitypen verschoben! 
33.
34.
 
35.
echo Kopiere %Typ% von %Quelle% nach 
36.
     %Sammel% ... 
37.
 
38.
for /r "%Quelle%" %%i in (*.%Typ%) do call :ProcessFile "%%i" 
39.
goto :eof 
40.
 
41.
:ProcessFile 
42.
move /-Y %1 "%Sammel%\%Prae%%Nr:~-5%.%Typ%" 
43.
set /a Nr+=1 
44.
goto :eof 
45.
 
46.
dir /s "%Quelle%\%Typ%" > %~n0.log 
47.
 
Ich hoffe, dass ich trotz meiner sehr großen Unwissendheit über Batch und Co alles bis jetzt korrekt kopiert und angepasst habe
Es fehlt dann noch die Abfrage des Zielordners und evtl. eine Abfrage, wie hoch der Zähler bei den bereits vorhandenen Dateien ist (wenn das überhaupt geht

Schönen Abend noch!
Gruß
Tobias
Bitte warten ..
Mitglied: bastla
15.10.2009 um 21:33 Uhr
Hallo obi134!

Da Du ja zumindest 3 Parameter brauchst, wäre
if %3. == . ( 
zu verwenden, und der optionale Parameter "Maske" als Letzter einzugeben (und zwar ohne "*" und ohne Punkt).
In der Zeile 28 fehlt die "1" am Anfang - richtig wäre:
set /a Nr=100001
Zahlen werden ohne führenden Nullen gespeichert, sodass Du diese Nullen nur erhältst, indem Du eine größere Zahl verwendest und die entsprechende Stellenanzahl (im Beispiel waren es 5) am Ende der Zahl entnimmst (siehe auch unten).
... eine Abfrage, wie hoch der Zähler bei den bereits vorhandenen Dateien ist (wenn das überhaupt geht
Ließe sich etwa so (als Ersatz der Zeile 28) realisieren:
01.
set "Letzte=00000" 
02.
for /f %%i in ('dir /b /on "%Sammel%\%Prae%*.%Typ%" 2^>nul') do set "Letzte=%%~ni" 
03.
set /a Nr=1%Letzte:~-5%+1
Damit werden die entsprechenden Dateinamen (wegen der fixen Länge der laufenden Nummer auch richtig) sortiert durchlaufen und als Zwischenergebnis in der Variablen %Letzte% für den Namen mit der höchsten Nummer nur der Dateiname (also zB ohne ".jpg") gespeichert - dessen letzte 5 Stellen werden an 1 angefügt, woraus sich zB 100012 ergibt und dieses Ergebnis gleich noch um 1 erhöht, um aus dem Ergebnis (zB 100013) wiederum die letzten 5 Stellen (dann also 00013) als nächste Nummer verwenden zu können.
Abfrage des Zielordners zB so:
if not exist "%Sammel%" md "%Sammel%"
Deine Zeile 46 wird nie erreicht, da der Batch mit Zeile 39 endet - daher zwischen die Zeilen 38 und 39 einfügen - außerdem enthält ja %Typ% weder "*" noch ".", daher: "%Quelle%\*.%Typ%" verwenden ...

Grüße
bastla
Bitte warten ..
Mitglied: obi134
16.10.2009 um 14:02 Uhr
Hey bastla du hast es voll drauf ^^
Der Code sieht nun so aus:

01.
@echo off & setlocal 
02.
 
03.
if %3. == . ( 
04.
  echo Nicht genug Parameter. 
05.
  echo Aufruf:   %~n0 ^<Quelle^> ^<Ziel^> Präfix [Maske]  
06.
  echo Beispiel: %~n0 c:\Bilder d:\Backup jpg bild 
07.
  echo           Kopiert alle *.jpg-Dateien aus c:\Bilder und Unterordnern "flach" 
08.
  echo           nach d:\Backup. Präfix gibt den Datei- Präfix an.Ist [Maske]  
09.
  echo           nicht angegeben, werden alle Dateien kopiert.  
10.
  exit /b 
11.
12.
 
13.
set "Quelle=%~1" 
14.
set "Sammel=%~2" 
15.
set "Prae=%3" 
16.
set "Typ=%4" 
17.
set "Letzte=00000" 
18.
 
19.
if not exist "%Sammel%" md "%Sammel%" 
20.
 
21.
for /f %%i in ('dir /b /on "%Sammel%\%Prae%*.%Typ%" 2^>nul') do set "Letzte=%%~ni" 
22.
set /a Nr=1%Letzte:~-5%+1 
23.
 
24.
echo Nächste Dateinummer ist %Letzte% 
25.
 
26.
if %Typ%. == . ( 
27.
  set "Typ=*" 
28.
  echo Es werden alle Dateitypen verschoben! 
29.
30.
 
31.
echo Kopiere %Typ% von %Quelle% nach 
32.
     %Sammel% ... 
33.
 
34.
for /r "%Quelle%" %%i in (*.%Typ%) do call :ProcessFile "%%i" 
35.
dir /s "%Quelle%\*.%Typ%" > %~n0.log 
36.
goto :eof 
37.
 
38.
:ProcessFile 
39.
move /-Y %1 "%Sammel%\%Prae%%Nr:~-5%.%Typ%" 
40.
set /a Nr+=1 
41.
goto :eof
Kann man nach Zeile 32 noch eine Bestätigung einbauen, sodass man noch abbrechen kann, falls was nicht passt?
z.B. Fortfahren? (ja/nein)

Gruß
Tobias
Bitte warten ..
Mitglied: bastla
16.10.2009 um 14:43 Uhr
Hallo obi134!

Etwa so:
01.
set "Eingabe=" 
02.
set /p Eingabe=Fortfahren? (ja/nein)  
03.
if /i "%Eingabe:~0,1%" neq "j" goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: obi134
16.10.2009 um 14:56 Uhr
Okay, habe jetzt

01.
@echo off & setlocal 
02.
 
03.
if %3. == . ( 
04.
  echo Nicht genug Parameter. 
05.
  echo Aufruf:   %~n0 ^<Quelle^> ^<Ziel^> Praefix [Maske]  
06.
  echo Beispiel: %~n0 c:\Bilder d:\Backup jpg bild 
07.
  echo           Kopiert alle *.jpg-Dateien aus c:\Bilder und Unterordnern "flach" 
08.
  echo           nach d:\Backup. Praefix gibt den Datei- Praefix an.Ist [Maske]  
09.
  echo           nicht angegeben, werden alle Dateien kopiert.  
10.
  exit /b 
11.
12.
 
13.
set "Quelle=%~1" 
14.
set "Sammel=%~2" 
15.
set "Prae=%3" 
16.
set "Typ=%4" 
17.
set "Letzte=00000" 
18.
 
19.
if not exist "%Sammel%" md "%Sammel%" 
20.
 
21.
for /f %%i in ('dir /b /on "%Sammel%\%Prae%*.%Typ%" 2^>nul') do set "Letzte=%%~ni" 
22.
set /a Nr=1%Letzte:~-5%+1 
23.
 
24.
echo Nächste Dateinummer ist %Letzte% 
25.
 
26.
if %Typ%. == . ( 
27.
  set "Typ=*" 
28.
  echo Es werden alle Dateitypen verschoben! 
29.
30.
 
31.
echo Kopiere %Typ% von %Quelle% nach 
32.
     %Sammel% ... 
33.
 
34.
set /p Eingabe=Fortfahren? (ja/nein)  
35.
if /i "%Eingabe:~0,1%" neq "j" goto :eof 
36.
 
37.
for /r "%Quelle%" %%i in (*.%Typ%) do call :ProcessFile "%%i" 
38.
dir /s "%Quelle%\*.%Typ%" > %~n0.log 
39.
goto :eof 
40.
 
41.
:ProcessFile 
42.
move /-Y %1 "%Sammel%\%Prae%%Nr:~-5%.%Typ%" 
43.
set /a Nr+=1 
44.
goto :eof
Dann kommt folgendes:

C:\>flatmove "C:\Dokumente und Einstellungen\Obi\Desktop\test" "C:\Dokumente und
Einstellungen\Obi\Desktop\test12" text txt
Nõchste Dateinummer ist 00000
Kopiere txt von C:\Dokumente und Einstellungen\Obi\Desktop\test nach
Der Befehl "C:\Dokumente" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Fortfahren? (ja/nein) j
Datei nicht gefunden

was ist da noch falsch?
Danke!
Gruß
Tobias
Bitte warten ..
Mitglied: bastla
16.10.2009 um 15:11 Uhr
Hallo obi134!

Entweder die Zeilenschaltung am Ende der Zeile 31 entfernen oder ein "echo" an den Anfang der Zeile 32 setzen ...

Noch ein Hinweis: Zum Testen in Zeile 1 "echo on" anstelle von "echo off" verwenden - so wird jeder Befehl vor der Ausführung angezeigt und Du kannst Fehler leichter erkennen (besonders, wenn Du mit
flatmove "C:\Dokumente und Einstellungen\Obi\Desktop\test" "C:\Dokumente und 
Einstellungen\Obi\Desktop\test12" text txt >Ablauf.txt 2>&1
alle Ausgaben (auch jene auf dem Fehlerkanal 2) in eine Datei umleitest (die Eingabe der Bestätigung musst Du allerdings in diesem Fall "blind" machen).
Ansonsten wären noch "Textmängel" anzumerken : "Nächste" anstelle von "Letzte" Dateinummer (oder eben die Ausgabe von %Nr%) und "Kopiere" anstelle von "Verschiebe" ...

Grüße
bastla
Bitte warten ..
Mitglied: obi134
23.10.2009 um 11:22 Uhr
Da ich im Moment etwas krank bin dauert es noch etwas, bis ich das Skript mal austesten kann...
Ich melde mich dann mal, wenn ich es getestet habe.
Gruß
Tobias
Bitte warten ..
Mitglied: obi134
01.11.2009 um 13:55 Uhr
Klappt wunderbar!
Danke nochmal!
Gruß
Tobias
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Windows Netzwerk
Dateien und Ordner verschieben mit Rückfrage (1)

Frage von stefts zum Thema Windows Netzwerk ...

Batch & Shell
gelöst Ordner per Batch verschieben, Datei kopieren (2)

Frage von Shape.Shifter zum Thema Batch & Shell ...

Batch & Shell
gelöst Dateien anhand des Namens in neue Ordner verschieben (17)

Frage von Cookiemonster zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...