Batch für spezifisches Kopieren von JPG-Dateien und zusätzlichem Umbenennen nach Texteingabe und Reihenfolge
Hallo Experten
Ich habe eine stets wiederkehrende Arbeit am PC, die ich gerne mit einem Batch erledigen würde - nur fehlt mir leider das Wissen dazu, bzw. scheitere ich schon bei den Ansätzen und die Aufgabe ist zu spezifisch um im Netz ein schon vorhandenes Script zu finden.
Folgendes Szenario:
Auf Laufwerk: Z habe ich einen Ordner "Bilder" und darin beliebig viele Unterordnern (nur 1 Level) mit beliebigen Namen in denen beliebig viele Bilder im jpg-Format vorhanden sind.
Nun möchte ich jeweils nur das erste JPG (nach Namen sortiert) aus allen Unterordnern in der richtigen Reihenfolge in einen neuen Ordner "Z: Bilder neu" kopieren und umbenennen.
Vom Ablauf her habe ich mir das so vorgestellt:
Ich starte den Batch und bekomme eine Texteingabe-Aufforderung - schreibe z.B. "Sommer 2014" und das Script starten nun beim ersten Unterordner (nach Name sortiert) und kopiert das erste JPG nach "Z: Bilder neu" (schon erstellt) in einen neuen Unterordner mit dem Namen der Texteingabe "Sommer 2014" (soll einmalig erstellt werden) und dem Dateinamen "Sommer 2014 001".
Das erste Bild aus dem 2. Unterordner sollte dann "Sommer 2014 002" heißen usw. bis alle Unterordner in "Z: Bilder" abgearbeitet sind.
Optional: Was ist zu ändern wenn ich z.B. nur das 20. Bild kopieren möchte.
Welche Ergänzung braucht es wenn die Bilder z.T. tiefer in der Ordnerstruktur (unterschiedlich) angesiedelt sind.
Beispiel:
Anstatt
Z: Bilder\August01\(JPG-Dateien)
wäre da z.B.
Z: Bilder\August01(ohne JPG-Dateien)\neu\(JPG-Dateien)
Ich wäre für Eure Hilfe dankbar.
LG
Legolegolas
Ich habe eine stets wiederkehrende Arbeit am PC, die ich gerne mit einem Batch erledigen würde - nur fehlt mir leider das Wissen dazu, bzw. scheitere ich schon bei den Ansätzen und die Aufgabe ist zu spezifisch um im Netz ein schon vorhandenes Script zu finden.
Folgendes Szenario:
Auf Laufwerk: Z habe ich einen Ordner "Bilder" und darin beliebig viele Unterordnern (nur 1 Level) mit beliebigen Namen in denen beliebig viele Bilder im jpg-Format vorhanden sind.
Nun möchte ich jeweils nur das erste JPG (nach Namen sortiert) aus allen Unterordnern in der richtigen Reihenfolge in einen neuen Ordner "Z: Bilder neu" kopieren und umbenennen.
Vom Ablauf her habe ich mir das so vorgestellt:
Ich starte den Batch und bekomme eine Texteingabe-Aufforderung - schreibe z.B. "Sommer 2014" und das Script starten nun beim ersten Unterordner (nach Name sortiert) und kopiert das erste JPG nach "Z: Bilder neu" (schon erstellt) in einen neuen Unterordner mit dem Namen der Texteingabe "Sommer 2014" (soll einmalig erstellt werden) und dem Dateinamen "Sommer 2014 001".
Das erste Bild aus dem 2. Unterordner sollte dann "Sommer 2014 002" heißen usw. bis alle Unterordner in "Z: Bilder" abgearbeitet sind.
Optional: Was ist zu ändern wenn ich z.B. nur das 20. Bild kopieren möchte.
Welche Ergänzung braucht es wenn die Bilder z.T. tiefer in der Ordnerstruktur (unterschiedlich) angesiedelt sind.
Beispiel:
Anstatt
Z: Bilder\August01\(JPG-Dateien)
wäre da z.B.
Z: Bilder\August01(ohne JPG-Dateien)\neu\(JPG-Dateien)
Ich wäre für Eure Hilfe dankbar.
LG
Legolegolas
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 247202
Url: https://administrator.de/forum/batch-fuer-spezifisches-kopieren-von-jpg-dateien-und-zusaetzlichem-umbenennen-nach-texteingabe-und-247202.html
Ausgedruckt am: 16.02.2025 um 22:02 Uhr
14 Kommentare
Neuester Kommentar
Hallo Legolegolas, willkommen im Forum.
Den ersten Teil deiner Frage + dem Zusatz des wievielten Bilds könnte man etwa so lösen:
Grüße
rubberman
Edit: Zeile 16 und 17 getauscht
Den ersten Teil deiner Frage + dem Zusatz des wievielten Bilds könnte man etwa so lösen:
@echo off &setlocal
set "copyFrom=Z:\Bilder"
set "copyTo=Z:\Bilder neu"
set "nthPicture=1"
:inpLoop
set "basename="
set /p "basename=Name: "
if not defined basename goto inpLoop
setlocal EnableDelayedExpansion
for /f delims^=\/:*?^<^>^|^" %%i in ("!basename!") do if "!basename!" neq "%%i" (endlocal &goto inpLoop)
if "!basename:~-1!"==" " (endlocal &goto inpLoop)
endlocal
md "%copyTo%\%basename%" || goto inpLoop
set "copyTo=%copyTo%\%basename%"
set /a "n=1000"
for /f "delims=" %%i in ('dir /ad /b /on "%copyFrom%\*"') do (
for /f "tokens=1* delims=:" %%j in ('dir /a-d /b /on "%copyFrom%\%%i\*.jpg"^|findstr /n .') do (
if "%%j"=="%nthPicture%" (
set /a "n += 1"
setlocal EnableDelayedExpansion
for %%l in (!n:~-3!) do (
copy "!copyFrom!\%%i\%%k" "!copyTo!\!basename! %%l.jpg"
)
endlocal
)
)
)
Welche Ergänzung braucht es wenn die Bilder z.T. tiefer in der Ordnerstruktur (unterschiedlich) angesiedelt sind.
Nach was sollte dann sortiert werden? Nach dem Name des Unterverzeichnisses im ersten Level?Grüße
rubberman
Edit: Zeile 16 und 17 getauscht
Hallo Legolegolas,
dann sollten die benötigten Änderungen marginal sein ...
Grüße
rubbermann
dann sollten die benötigten Änderungen marginal sein ...
@echo off &setlocal
set "copyFrom=Z:\Bilder"
set "copyTo=Z:\Bilder neu"
set "nthPicture=1"
:inpLoop
set "basename="
set /p "basename=Name: "
if not defined basename goto inpLoop
setlocal EnableDelayedExpansion
for /f delims^=\/:*?^<^>^|^" %%i in ("!basename!") do if "!basename!" neq "%%i" (endlocal &goto inpLoop)
if "!basename:~-1!"==" " (endlocal &goto inpLoop)
endlocal
md "%copyTo%\%basename%" || goto inpLoop
set "copyTo=%copyTo%\%basename%"
set /a "n=1000"
for /f "delims=" %%i in ('dir /ad /b /on "%copyFrom%\*"') do (
for /f "tokens=1* delims=:" %%j in ('dir /a-d /b /on /s "%copyFrom%\%%i\*.jpg"^|findstr /n .') do (
if "%%j"=="%nthPicture%" (
set /a "n += 1"
setlocal EnableDelayedExpansion
for %%l in (!n:~-3!) do (
copy "%%k" "!copyTo!\!basename! %%l.jpg"
)
endlocal
)
)
)
Grüße
rubbermann
Hallo Yunkyard.
Grüße
rubberman
Was ist zu tun wenn man ALLE Bilder im Ordner umbenennen will?
Da das nicht der Anforderung von Legolegolas entspricht, auf jeden Fall einen eigenen Thread aufmachen und dann genauer erklären, was wie umbenannt werden soll (alle rekursiv, alle nur im ersten Level, wie viele Dateien maximal wegen der vorangestellten Nullen etc.).Grüße
rubberman
Hallo Legolegolas.
Eigentlich gibt es diese Einstellung bereits. Der initiale Wert der Variablen
Am Ende ist es also ganz einfach: Wenn du mit 007 starten willst, dann ist der Anfangswert für![face-wink face-wink](/images/icons/fa/light/face-laugh-wink.svg)
Grüße
rubberman
Und eben diese Ausnahmen - ich bräuchte noch eine Set-Einstellung für den Anfang der Aufzählung (kann sein, dass ich z.B. mit 007 anstatt mit 001 anfangen muss)
Eigentlich gibt es diese Einstellung bereits. Der initiale Wert der Variablen
n
ist hier entscheidend. Im Beispiel ist er 1000
. Beim ersten Schleifendurchlauf wird er auf 1001 erhöht, beim zweiten auf 1002, etc. Für den Name der kopierten Datei werden dann jeweils die letzten 3 Ziffern herangezogen (auf diese Weise kommt man zu den vorangestellten Nullen).Am Ende ist es also ganz einfach: Wenn du mit 007 starten willst, dann ist der Anfangswert für
n
eben 1006 statt 1000. Das war's schon Grüße
rubberman
Hallo Legolegolas,
das lässt sich umgehen, indem man Variablenzuweisungen bei ausgeschalteter verzögerter Variablenerweiterung vornimmt und die Verarbeitung der Variablen mit eingeschalteter verzögerter Variablenerweiterung.
Beispiele zur Verdeutlichung:
funktioniert nicht
funktioniert
Grüße
rubberman
das lässt sich umgehen, indem man Variablenzuweisungen bei ausgeschalteter verzögerter Variablenerweiterung vornimmt und die Verarbeitung der Variablen mit eingeschalteter verzögerter Variablenerweiterung.
Beispiele zur Verdeutlichung:
funktioniert nicht
@echo off
setlocal DisableDelayedExpansion
md "test~ohneAusrufezeichen"
md "test~mit!"
setlocal EnableDelayedExpansion
for /d %%i in ("test~*") do (
set "foldername=%%i"
echo !foldername!
)
endlocal
rd "test~ohneAusrufezeichen"
rd "test~mit!"
pause
funktioniert
@echo off
setlocal DisableDelayedExpansion
md "test~ohneAusrufezeichen"
md "test~mit!"
for /d %%i in ("test~*") do (
set "foldername=%%i"
setlocal EnableDelayedExpansion
echo !foldername!
endlocal
)
rd "test~ohneAusrufezeichen"
rd "test~mit!"
pause
Grüße
rubberman
Wenn ich das richtig verstanden habe muss ich 2 Zeilen richtig positionieren:
- setlocal DisableDelayedExpansion
- setlocal EnableDelayedExpansion
Hast du nur zur Hälfte verstanden. Das - setlocal DisableDelayedExpansion
- setlocal EnableDelayedExpansion
endlocal
spielt eine genauso große Rolle. Damit wird die vorher mit setlocal
erzeugte Subumgebung wieder beendet.Schmeiß mal die ganzen ECHO OFFs aus deinem Code (auch die sowieso sinnlosen mitten im Script). Und schau dir dann mal an, wo der Fehler auftaucht.
Grüße
rubberman