Fehlersuche in Batch zur Datei-Umbenennung
Übergabe des Dateinamens an das Unterprogramm?
Hallo zusammen,
ich möchte mit Hilfe eines Batchs mehrere Dateien (in diesem Fall JPG's) umbenennen, genauer gesagt nummerieren. Was ich mir bisher zusammengeschustert habe, seht ihr unten. Mein Problem: "Das System kann die angegebene Datei nicht finden." Wie kann dem Abhilfe geschaffen werden?
@echo off
set /a counter=1
for %%f in (*.jpg) do call :check
goto :print
:check
ren %%f %counter%".jpg"
set /a counter+=1
goto :end
:print
set /a counter-=1
echo %counter% Dateien umbenannt.
goto :end
:end
Vielen Dank im Voraus!
Schöne Grüße, IrieDaily
Hallo zusammen,
ich möchte mit Hilfe eines Batchs mehrere Dateien (in diesem Fall JPG's) umbenennen, genauer gesagt nummerieren. Was ich mir bisher zusammengeschustert habe, seht ihr unten. Mein Problem: "Das System kann die angegebene Datei nicht finden." Wie kann dem Abhilfe geschaffen werden?
@echo off
set /a counter=1
for %%f in (*.jpg) do call :check
goto :print
:check
ren %%f %counter%".jpg"
set /a counter+=1
goto :end
set /a counter-=1
echo %counter% Dateien umbenannt.
goto :end
:end
Vielen Dank im Voraus!
Schöne Grüße, IrieDaily
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 51374
Url: https://administrator.de/forum/fehlersuche-in-batch-zur-datei-umbenennung-51374.html
Ausgedruckt am: 22.04.2025 um 18:04 Uhr
17 Kommentare
Neuester Kommentar
G' Abend,
also das kann gar nicht gehen. Die Schleife ist falsch konstruiert.
Ich habe den Batch mal optimiert!! Die Verbesserungen von "bastla" (siehe unten) wurden bereits von mir implementiert. Thx...
Nennt alle Dateien mit der Endung "jpg" um. Sprich du musst legendlich den Pfad in der Variable "src_dir" ändern. Die Bilder werden in Bildxx.jpg umbenannt. Der Zähler liefert so auch das richtige Ergebnis. Viel Spaß damit...
Gruß
Dani
also das kann gar nicht gehen. Die Schleife ist falsch konstruiert.
Ich habe den Batch mal optimiert!! Die Verbesserungen von "bastla" (siehe unten) wurden bereits von mir implementiert. Thx...
@echo off & Setlocal EnableDelayedExpansion
set counter=1
set src_dir=C:\test
set file_type=txt
for /f "delims=" %%a in ('dir /b "%src_dir%\*.%file_type%"') do (
ren "%src_dir%\%%a" "Bild!counter!.%file_type%"
set /a counter+=1
)
set /a counter-=1
echo %counter% Dateien umbenannt.
Gruß
Dani
Hallo IrieDaily und willkommen im Forum!
Beim Aufruf mit "call" verhält sich das aufgerufene Unterprogramm wie ein neuer Batch, daher sind bei Bedarf Argumente zu übergeben und im Unterprogramm wie üblich mit %1, %2, ... anzusprechen. Es sollte daher so gehen:
Als Alternative könntest Du vielleicht noch den Counter auf zB 10001 setzen und beim Umbenennen durch Verwendung von "%counter:~1%.jpg" einen Dateinamen der Form "0001.jpg" (also mit führenden Nullen) erhalten (:~1 sorgt für das Weglassen der ersten Stelle, würde also bei einem Startwert von zB 1001 genauso funktionieren).
Und willst Du die Dateien nach dem Datum sortiert, so würde die "for"-Zeile etwa so aussehen:
Übersetzung: Zeige die Namen aller *.jpg-Dateien (aber keine Ordner - nur zur Sicherheit) nach Datum aufsteigend sortiert (älteste zuerst) an und bearbeite jede einzelne Datei mit dem Unterprogramm "check", wobei enthaltene Leerzeichen mit übergeben werden.
Grüße
bastla
Beim Aufruf mit "call" verhält sich das aufgerufene Unterprogramm wie ein neuer Batch, daher sind bei Bedarf Argumente zu übergeben und im Unterprogramm wie üblich mit %1, %2, ... anzusprechen. Es sollte daher so gehen:
@echo off
set /a counter=1
for %%f in (*.jpg) do call :check "%%f"
goto :print
:check
ren %1 "%counter%.jpg"
set /a counter+=1
goto :end
:print
set /a counter-=1
echo %counter% Dateien umbenannt.
goto :end
:end
Und willst Du die Dateien nach dem Datum sortiert, so würde die "for"-Zeile etwa so aussehen:
for "delims=" %%f in ('dir /b /od /a-d *.jpg') do call check "%%f"
Grüße
bastla
@Dani
Warst Du also wieder einmal schneller - und dabei hast Du noch zweimal "set " zuviel geschrieben (kopiert) ...
Grüße
bastla
Warst Du also wieder einmal schneller - und dabei hast Du noch zweimal "set " zuviel geschrieben (kopiert) ...
Grüße
bastla
@Dani
Bei Verwendung des %file_type% hattest Du das "set " vorneweg mitkopiert.
Das "/a" beim "set Counter+=1" wäre auch noch nachzutragen.
Grüße
bastla
Bei Verwendung des %file_type% hattest Du das "set " vorneweg mitkopiert.
Das "/a" beim "set Counter+=1" wäre auch noch nachzutragen.
Grüße
bastla
@Dani
Grüße
bastla
Warum brauche ich das /a. Geht doch auch ohne, oder??
Das Weiterzählen fällt unter "artihmetische Operation" - bei mir geht's nicht ohne.Grüße
bastla
Kleinere Verbesserungsvorschläge hätte ich auch noch (wenn ich auch ein "bisschen optimieren" darf) ...*gg
Die Skizze darüber etwas eingedampft sieht so aus:
-bzw- mit den neuen Namen in einheitlicher Länge:
Und das ganze mit "EnableDelayedExpansion":
Gruss
Biber
for "delims=" %%f in ('dir /b /od /a-d *.jpg') do call check "%%f"
Hier würde ein Doppelpunkt vor vor dem "check" lästige Fehlermeldungen vermeiden.Die Skizze darüber etwas eingedampft sieht so aus:
@echo off <b>& setlocal</b>
set /a counter=0
for %%f in (*.jpg) do call :check "%%f"
echo %counter% Dateien umbenannt.
goto :eof
:check
set /a counter+=1
ren %1 "%counter%.jpg"
@echo off <b>& setlocal</b>
set /a counter=90000
REM In der Wildcard-Angabe steht jetzt *.jpg...
for %%f in (*.jpg) do call :check "%%f"
Set /a counter-=90000
echo %counter% Dateien umbenannt.
goto :eof
:check
set /a counter+=1
REM ...dafür steht hier jetzt nicht mehr fest verdrahtet *.jpg..
REM nur eine Stelle im Code zu ändern, wenn mal was anderes umbenannt werden soll
ren %1 "%counter:~1%.%~x1"
Und das ganze mit "EnableDelayedExpansion":
@echo off <b>& setlocal EnableDelayedExpansion</b>
set /a counter=90000
for %%f in (*.jpg) do Set /a "counter+=1" & ren "%%f" "!counter:~1!.jpg"
echo %counter% Dateien umbenannt.
Gruss
Biber
@Biber
Was bringen mir eigentlich hier:
Grüße
bastla
Was bringen mir eigentlich hier:
ren "%1" "%counter:~1%.jpg"
die Anführungszeichen bei %1?Grüße
bastla
@bastla
[Konnte ja nicht ahnen, dass Du so schnell hier bist..*gg]
Grüsse
Biber
Was bringen mir hier...
Nichts, die hatte ich auch gesehen und wieder rauskorrigiert, bevor ich Deinen letzten Kommentar gelesen hatte.[Konnte ja nicht ahnen, dass Du so schnell hier bist..*gg]
Grüsse
Biber
@Biber
Eigentlich wollte ich auch nur ganz kurz bleiben (wie Du an den unterlassenen Optimierungen / kosmetischen Operationen oben bemerken kannst), aber wie's halt manchmal kommt ... Lass Dich aber nur nicht stören.
Grüße
bastla
Eigentlich wollte ich auch nur ganz kurz bleiben (wie Du an den unterlassenen Optimierungen / kosmetischen Operationen oben bemerken kannst), aber wie's halt manchmal kommt ... Lass Dich aber nur nicht stören.
Grüße
bastla
Moin IrieDaily,
Jein....also konkrete Fragen schon. Selbstverständlich.
Aber ich wäre dankbar dafür, wenn wir als Kompromiss die Regelung hätten:
-> Du schaust am CMD-Prompt mit "CALL /?", "goto /?" , "CMD /?" die nachlesbaren M$-Hilfen und Beispiele an (die sind wirklich nicht schlecht oder unvollständig).
-> was dann noch unklar ist, können und werden wir gerne beantworten
Nur aus jedem Gebrauchsschnipsel ein Tutorial machen, dass sprengt unseren Rahmen.
Da bitte ich um Dein Verständnis.
Gibt es denn konkrete Stellen in den Beispielskripts oben, die Du nicht verstehst?
Gruss Biber
Habt ihr Lust, sie mir hier kurz zu erklären ...
Jein....also konkrete Fragen schon. Selbstverständlich.
Aber ich wäre dankbar dafür, wenn wir als Kompromiss die Regelung hätten:
-> Du schaust am CMD-Prompt mit "CALL /?", "goto /?" , "CMD /?" die nachlesbaren M$-Hilfen und Beispiele an (die sind wirklich nicht schlecht oder unvollständig).
-> was dann noch unklar ist, können und werden wir gerne beantworten
Nur aus jedem Gebrauchsschnipsel ein Tutorial machen, dass sprengt unseren Rahmen.
Da bitte ich um Dein Verständnis.
Gibt es denn konkrete Stellen in den Beispielskripts oben, die Du nicht verstehst?
Gruss Biber
Hallo IrieDaily!
Wie Du richtig erkannst hast, wäre Deine Frage eigentlich Gegenstand eines neuen Themas ...
However - falls das Tool nur einen Rückgabewert wie beschrieben liefert:
Ansonsten müsstest Du über "tokens" den gesuchten Teil aus dem Rückgabetext herausfiltern.
Grüße
bastla
Wie Du richtig erkannst hast, wäre Deine Frage eigentlich Gegenstand eines neuen Themas ...
However - falls das Tool nur einen Rückgabewert wie beschrieben liefert:
for /f %%i in ('identify -format "%w" 1.jpg') do set width=%%i
Grüße
bastla