Dateien aus Unterverzeichnissen in einen Ordner verschieben - mit Batch?
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 127222
Url: https://administrator.de/contentid/127222
Ausgedruckt am: 22.11.2024 um 05:11 Uhr
11 Kommentare
Neuester Kommentar
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:
Wenn Du eine Parameterübergabe dem Anpassen der Zeilen 2 bis 5 vorziehst, kannst Du diese Zeilen etwa so schreiben:
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
durch
ersetzen. (Die Schreibweise mit
Grüße
bastla
P.S.:
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:
@echo off & setlocal
set "Sammel=D:\Sammelordner"
set "Quelle=D:\Quellordner"
set "Prae=bild"
set "Typ=jpg"
set /a Nr=1000001
for /r "%Quelle%" %%i in (*.%Typ%) do call :ProcessFile "%%i"
goto :eof
:ProcessFile
move %1 "%Sammel%\%Prae%%Nr:~-5%.%Typ%"
set /a Nr+=1
goto :eof
set "Sammel=%~1"
set "Quelle=%~2"
...
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%"
move %1 "%Sammel%\%Prae%%Nr%.%Typ%"
.%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.
Hallo obi134!
Nur zur Sicherheit: Im Entwurf oben wird verschoben und ggf ohne Rückfrage überschrieben - um das zu vermeiden, müsstest Du dem
Grüße
bastla
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
Hallo obi134!
Da Du ja zumindest 3 Parameter brauchst, wäre
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:
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).
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:
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
Da Du ja zumindest 3 Parameter brauchst, wäre
if %3. == . (
In der Zeile 28 fehlt die "1" am Anfang - richtig wäre:
set /a Nr=100001
... 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:set "Letzte=00000"
for /f %%i in ('dir /b /on "%Sammel%\%Prae%*.%Typ%" 2^>nul') do set "Letzte=%%~ni"
set /a Nr=1%Letzte:~-5%+1
Abfrage des Zielordners zB so:
if not exist "%Sammel%" md "%Sammel%"
Grüße
bastla
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
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
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
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