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

Fehlersuche in Batch zur Datei-Umbenennung

Frage Entwicklung Batch & Shell

Mitglied: IrieDaily

IrieDaily (Level 1) - Jetzt verbinden

11.02.2007, aktualisiert 12.02.2007, 4817 Aufrufe, 17 Kommentare

Ü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
Mitglied: Dani
11.02.2007 um 23:19 Uhr
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...
01.
@echo off & Setlocal EnableDelayedExpansion 
02.
 
03.
set counter=1 
04.
set src_dir=C:\test 
05.
set file_type=txt 
06.
 
07.
for /f "delims=" %%a in ('dir /b "%src_dir%\*.%file_type%"') do ( 
08.
    ren "%src_dir%\%%a" "Bild!counter!.%file_type%" 
09.
    set /a counter+=1 
10.
11.
set /a counter-=1 
12.
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
Bitte warten ..
Mitglied: bastla
11.02.2007 um 23:28 Uhr
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:
01.
@echo off 
02.
set /a counter=1 
03.
for %%f in (*.jpg) do call :check "%%f" 
04.
goto :print 
05.
 
06.
:check 
07.
ren %1 "%counter%.jpg" 
08.
set /a counter+=1 
09.
goto :end 
10.
 
11.
:print 
12.
set /a counter-=1 
13.
echo %counter% Dateien umbenannt. 
14.
goto :end 
15.
 
16.
: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:
01.
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
Bitte warten ..
Mitglied: bastla
11.02.2007 um 23:30 Uhr
@Dani

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

Grüße
bastla
Bitte warten ..
Mitglied: Dani
11.02.2007 um 23:40 Uhr
Abend bastla,
wo habe ich 2 "set" zu viel?! Passt doch so...oder hab ich wieder mal ein Tief?


Gruß
Dani
Bitte warten ..
Mitglied: bastla
11.02.2007 um 23:44 Uhr
@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
Bitte warten ..
Mitglied: Dani
11.02.2007 um 23:48 Uhr
Oha...stimmt. Warum erkennt mein copy & paste das nicht?? => blödes Windows.
Warum brauche ich das /a. Geht doch auch ohne, oder??


Gruß
Dani
Bitte warten ..
Mitglied: bastla
11.02.2007 um 23:55 Uhr
@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
Bitte warten ..
Mitglied: Dani
12.02.2007 um 00:12 Uhr
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
Bitte warten ..
Mitglied: bastla
12.02.2007 um 00:19 Uhr
@Dani

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

Gute Nacht
bastla
Bitte warten ..
Mitglied: Biber
12.02.2007 um 00:29 Uhr
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:
01.
@echo off <b>& setlocal</b> 
02.
set /a counter=0 
03.
for %%f in (*.jpg) do call :check "%%f" 
04.
echo %counter% Dateien umbenannt. 
05.
goto :eof 
06.
 
07.
:check 
08.
set /a counter+=1 
09.
ren %1 "%counter%.jpg"
-bzw- mit den neuen Namen in einheitlicher Länge:
01.
@echo off <b>& setlocal</b> 
02.
set /a counter=90000 
03.
REM In der Wildcard-Angabe steht jetzt *.jpg... 
04.
for %%f in (*.jpg) do call :check "%%f" 
05.
Set /a counter-=90000 
06.
echo %counter% Dateien umbenannt. 
07.
goto :eof 
08.
 
09.
:check 
10.
set /a counter+=1 
11.
REM ...dafür steht hier jetzt nicht mehr fest verdrahtet *.jpg..  
12.
REM nur eine Stelle im Code zu ändern, wenn mal was anderes umbenannt werden soll 
13.
ren %1 "%counter:~1%.%~x1"
Und das ganze mit "EnableDelayedExpansion":
01.
@echo off <b>& setlocal EnableDelayedExpansion</b> 
02.
set /a counter=90000 
03.
for %%f in (*.jpg) do Set /a "counter+=1" & ren "%%f" "!counter:~1!.jpg" 
04.
echo %counter% Dateien umbenannt.
Gruss
Biber
Bitte warten ..
Mitglied: bastla
12.02.2007 um 00:36 Uhr
@Biber

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

Grüße
bastla
Bitte warten ..
Mitglied: Biber
12.02.2007 um 00:41 Uhr
@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
Bitte warten ..
Mitglied: bastla
12.02.2007 um 00:49 Uhr
@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
Bitte warten ..
Mitglied: IrieDaily
12.02.2007 um 09:52 Uhr
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? 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
Bitte warten ..
Mitglied: Biber
12.02.2007 um 13:43 Uhr
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
Bitte warten ..
Mitglied: IrieDaily
12.02.2007 um 18:55 Uhr
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
Bitte warten ..
Mitglied: bastla
12.02.2007 um 19:14 Uhr
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:
01.
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
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
Ä in batch Datei (12)

Frage von BergEnte zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...