iriedaily
Goto Top

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

Content-Key: 51374

Url: https://administrator.de/contentid/51374

Printed on: April 24, 2024 at 19:04 o'clock

Member: Dani
Dani Feb 11, 2007 at 22:19:10 (UTC)
Goto Top
G' Abend,
also das kann gar nicht gehen. Die Schleife ist falsch konstruiert. face-smile

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.
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
Member: bastla
bastla Feb 11, 2007 at 22:28:15 (UTC)
Goto Top
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:
@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
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:
for "delims=" %%f in ('dir /b /od /a-d *.jpg') do call check "%%f"  
Ü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
Member: bastla
bastla Feb 11, 2007 at 22:30:10 (UTC)
Goto Top
@Dani

Warst Du also wieder einmal schneller - und dabei hast Du noch zweimal "set " zuviel geschrieben (kopiert) ... face-wink

Grüße
bastla
Member: Dani
Dani Feb 11, 2007 at 22:40:21 (UTC)
Goto Top
Abend bastla,
wo habe ich 2 "set" zu viel?! Passt doch so...oder hab ich wieder mal ein Tief?


Gruß
Dani
Member: bastla
bastla Feb 11, 2007 at 22:44:05 (UTC)
Goto Top
@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
Member: Dani
Dani Feb 11, 2007 at 22:48:00 (UTC)
Goto Top
Oha...stimmt. Warum erkennt mein copy & paste das nicht?? => blödes Windows. face-smile
Warum brauche ich das /a. Geht doch auch ohne, oder??


Gruß
Dani
Member: bastla
bastla Feb 11, 2007 at 22:55:20 (UTC)
Goto Top
@Dani

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
Member: Dani
Dani Feb 11, 2007 at 23:12:29 (UTC)
Goto Top
Schon komisch....also irgendwie hat meine Konsole was an der Waffel. Vorher gings....gerade eben wieder nicht.
Ich habe meine Version auf den Stand "Final" gebracht. Eigentlich ist es jetzt dein Entwurf!
thx...


Gruß
Dani
Member: bastla
bastla Feb 11, 2007 at 23:19:03 (UTC)
Goto Top
@Dani

Ich würd's als per Teamwork verbesserten Entwurf von IrieDaily betrachten ...

Gute Nacht
bastla
Member: Biber
Biber Feb 11, 2007 at 23:29:10 (UTC)
Goto Top
Kleinere Verbesserungsvorschläge hätte ich auch noch (wenn ich auch ein "bisschen optimieren" darf) ...*gg

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"  
-bzw- mit den neuen Namen in einheitlicher Länge:
@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
Member: bastla
bastla Feb 11, 2007 at 23:36:18 (UTC)
Goto Top
@Biber

Was bringen mir eigentlich hier:
ren "%1" "%counter:~1%.jpg"
die Anführungszeichen bei %1?

Grüße
bastla
Member: Biber
Biber Feb 11, 2007 at 23:41:53 (UTC)
Goto Top
@bastla
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
Member: bastla
bastla Feb 11, 2007 at 23:49:15 (UTC)
Goto Top
@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. face-wink

Grüße
bastla
Member: IrieDaily
IrieDaily Feb 12, 2007 at 08:52:49 (UTC)
Goto Top
Wow, ihr seid ja fleißig - vielen Dank für die prompten und hilfreichen Antworten!

Ich muss dazu sagen, dass ich absoluter Neuling in diesem Gebiet bin und nur die ganz simplen Befehle verstehe. Deshalb ist mir bastlas erste Änderung meines Entwurfes sehr sympathisch. Danis Skript funktioniert mit Sicherheit ebenso gut, jedoch habe ich das Problem, die Hälfte nicht zu verstehen. Und sowas wurmt mich immer...

Nun zu den Dingen, die ich nicht verstehe. Habt ihr Lust, sie mir hier kurz zu erklären oder habt ihr vielleicht einen Link parat, unter dem ich das nachlesen könnte? face-smile Auf den Seiten, die ich bisher durchstöbert habe, war das Niveau meist entweder zu grundlegend oder gleich über meinen Kapazitäten.

Schönen Gruß, IrieDaily

P.S. Bibers Skripte sind natürlich auch toll, um niemanden zu vergessen face-wink
Member: Biber
Biber Feb 12, 2007 at 12:43:11 (UTC)
Goto Top
Moin IrieDaily,

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
Member: IrieDaily
IrieDaily Feb 12, 2007 at 17:55:42 (UTC)
Goto Top
Guten Abend,

da ich heute leider wenig Zeit habe, hätte ich noch eine prinzipielle Frage, bevor ich die Microsoft-Hilfen durcharbeite und gegebenenfalls noch einmal nachfrage.

Wie kann man einen Ausgabewert an eine Variable übergeben?

Mit Ausgabewert meine ich eine Zahl, welche zuvor durch ein kleines Programm ermittelt und ausgegeben wird. Genauer gesagt geht es um das Tool "identify" aus dem Paket ImageMagick. Damit ermittle ich bspw. die Breite eines Fotos, und das Ergebnis soll dann an eine Variable übergeben werden. Auf den Befehl identify -format "%w" 1.jpg erhalte ich z.B. den Wert 1752. Diesen Wert hätte ich nun gerne in einer Variable "width". Wie ist sowas machbar?

Vielen Dank schonmal, und bitte entschuldigt die Abschweifung vom ursprünglichen Thema!

Gruß, IrieDaily
Member: bastla
bastla Feb 12, 2007 at 18:14:02 (UTC)
Goto Top
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:
for /f %%i in ('identify -format "%w" 1.jpg') do set width=%%i  
Ansonsten müsstest Du über "tokens" den gesuchten Teil aus dem Rückgabetext herausfiltern.

Grüße
bastla