spidi-25
Goto Top

Umbenennen mit Abfrage

Hallo alle zusammen,

bin gerade am üben und verstehen von Batch´s

@echo off

FOR  %%i IN (*.mp3) DO (
  echo Dateinamen %%i umbenennen?
set new=
set /p new= neuen Dateinamen bitte eingeben:
ren "%%i" "%new%"  
)

was stimmt an meinem code nicht, ich bastle eine einfache Umbenennung mit Abfrage!

Grüße
Spidi-25

Content-ID: 150847

Url: https://administrator.de/forum/umbenennen-mit-abfrage-150847.html

Ausgedruckt am: 25.12.2024 um 06:12 Uhr

60730
60730 11.09.2010 um 23:54:36 Uhr
Goto Top
moin,

zum üben bitte die erste Zeile "wechlasern"

innerhalb von Schleifen gilt - die Variablen zuweisung klappert nicht ordentlich.
Dafür gibts delayed expansion und ! statt %.

btw:
echo Dateinamen %%i umbenennen?
Naja die Zeile ist zwar hübsch, anzusehen, aber wenn du kein
if not "!new!"=="" ren usw..
reinmontierst - nicht hübsch face-wink

Gruß
Spidi-25
Spidi-25 12.09.2010 um 02:00:53 Uhr
Goto Top
Hallo TimoBeil

danke für die Tips mit folgendem code

@echo off & setlocal enableDelayedExpansion  
for %%i in ("*.mp3") do (  
  echo Dateinamen %%i umbenennen?
     set "neu="  
set /p neu= neuen Dateinamen bitte eingeben:
ren "%%i" "!neu!"  
)
pause

wird umbenannt, aber die Dateiendung fehlt mir.

mit der Zeile kann ich noch nicht viel anfangen, bitte um Erläuterung.
if not "!new!"=="" ren usw..
bastla
bastla 12.09.2010 um 02:28:21 Uhr
Goto Top
Hallo Spidi-25!
if not "!new!"=="" ren usw.
ist so zu verstehen, dass ein Umbenennen nur sinnvoll ist, wenn auch ein neuer Name eingegeben wurde bzw, dass eben keine Eingabe (= nur "Enter") bedeutet, dass der Name nicht geändert werden soll ...

Zusammen mit dem Beibehalten der Endung könnte die Zeile 6 dann so aussehen:
if not "!neu!"=="" ren "%%i" "!neu!.*"
Zu beachten wäre allerdings, dass bei "!" im Namen unerwünschte Effekte auftreten können und auch die Art der Schleife zu Überraschungen führen könnte - daher würde ich eher zur folgenden Variante greifen:
@echo off & setlocal
for /f "delims=" %%i in ('dir /b *.mp3') do call :ProcessFile "%%i"  
pause
goto :eof

:ProcessFile
echo\
set "neu="  
set /p neu=Neuen Dateinamen fuer %1 bitte eingeben: 
if defined neu ren %1 "%neu%.*"  
goto :eof
Grüße
bastla
Friemler
Friemler 12.09.2010 um 03:16:16 Uhr
Goto Top
Hallo bastla,

eine kleine Fehlerquelle bleibt bei Deinem Code: Wenn der Dateiname ein ^ (Carret) enthält, verdoppelt der Kommandointerpreter dieses Zeichen bei der Übergabe von %%i. Aus Ein^Test.mp3 wird also in ProcessFile Ein^^Test.mp3. Wenn der Dateiname ein % (Prozent) enthält, kommt es auch zu Fehlern. Deshalb würde ich es lieber so machen:
@echo off & setlocal
for /f "delims=" %%i in ('dir /b *.mp3') do (  
  set "alt=%%i"  
  call :ProcessFile
)
pause
goto :eof

:ProcessFile
set "neu="  
echo\
set /p "neu=Neuen Dateinamen fuer %alt% bitte eingeben: "  
if defined neu ren "%alt%" "%neu%.*"  
goto :eof

Gruß
Friemler
bastla
bastla 12.09.2010 um 09:00:23 Uhr
Goto Top
@Friemler
Stimmt - wobei ein Name wohl eher etwa "%20" enthält als dass er zB "(^_^).mp3" lautet ... face-wink

Eigentlich müsste auch noch der eingegebene neue Name geprüft werden - und dann wäre ich jedenfalls bei VBS angekommen ...

Grüße
bastla
77559
77559 12.09.2010 um 10:51:21 Uhr
Goto Top
Hallo Spidi-25,

um deine vergessene Extension beim neuen Namen anzufügen kannst du diese Zeile :
If defined neu If /i "%neu:~-4%" NEQ ".mp3" set "neu=%neu%.mp3"
In Friemlers Code zwischen den Zeilen 12 und 13 einfügen.

Gruß
LotPings
bastla
bastla 12.09.2010 um 11:39:21 Uhr
Goto Top
Hallo LotPings!
Dann wäre allerdings der Stern in Zeile 13 überflüssig (und eine Variable für die Extension sinnvoll) ...

Grüße
bastla
77559
77559 12.09.2010 um 12:14:05 Uhr
Goto Top
Hast Recht, bastla,

hab ich übersehen.

Schönen Sonntag noch!

Gruß
LotPings
Friemler
Friemler 12.09.2010 um 12:49:42 Uhr
Goto Top
Hallo bastla,

VBS ist nicht unbedingt notwendig. Die Zeichen ^%& im neuen Dateinamen machen bei meinem Code sowieso keine Probleme. Allerdings dürfen ja die Zeichen
*?:<>|\/"
in Dateinamen nicht vorkommen. Deshalb hier noch eine Ergänzung, die darauf prüft:
@echo off & setlocal

for /f "delims=" %%i in ('dir /b *.mp3') do (  
  set "alt=%%i"  
  call :ProcessFile
)
pause
goto :eof


:ProcessFile
set "neu="  
echo\
set /p "neu=Neuen Dateinamen fuer %alt% bitte eingeben: "  

if not defined neu goto :eof

set "neu=%neu:"=*%"  
for /f %%n in ('set /p "=%neu%" ^<NUL ^| findstr "[\*?:<>|\\/]"') do (  
  echo\ & echo Ein Dateiname darf keines der Zeichen *?^<^>^|\/:^" enthalten! & pause>NUL  
  goto :ProcessFile
)

ren "%alt%" "%neu%.*"  
goto :eof

Das separate Ersetzen von " durch * in Zeile 18 habe ich eingefügt, da es mir nicht möglich war, das Anführungszeichen in die Zeichenmenge von FINDSTR aufzunehmen, ohne das es zu irgendwelchen Fehlern bei problematischen Zeichen kam.

Gruß
Friemler
Spidi-25
Spidi-25 12.09.2010 um 13:11:43 Uhr
Goto Top
hallo zusammen und danke erstmals,

das wäre jetzt der code ob wohl ich noch nicht alle verstehe.

@echo off & setlocal 
for /f "delims=" %%i in ('dir /b *.mp3 *.wave') do (   
  set "alt=%%i"   
  call :ProcessFile 
) 
goto :eof 

:ProcessFile 
set "neu="   
echo\ 
set /p "neu=Neuen Dateinamen fuer %alt% bitte eingeben: "  
If defined neu If /i "%neu:~-4%" NEQ ".*" set "neu=%neu%.*"  
if defined neu ren "%alt%" "%neu%"    
goto :eof

habe die Zeile 6 Pause entfernt, war nur für Übungszwecken gedacht.
in Zeile 12 habe ich .mp3 gegen .* getauscht da ein weiteres Format, ist das richtig so?

Kann man die Eingabe des neuen namens auch unterhalb der fuer bringen und zwar so

Neuen Dateinamen fuer (Alter Name) bitte eingeben:
                      (Neuen Namen)

goto :eof
was bedeutet die zeile?

muss bei call :ProcessFile immer :ProcessFile drin stehen?

Könnte man die komplette Liste der Befehle von CMD.exe wie z.B. die For/? Erklärung Drucken?

Schönen Sonntag ebenfalls!

Grüße
Spidi-25
Friemler
Friemler 12.09.2010 um 13:49:01 Uhr
Goto Top
Hallo Spidi-25,

Zeile 12 kannst Du komplett rauswerfen, dann aber Zeile 13 wieder in
if defined neu ren "%alt%" "%neu%.*"  
ändern. Wenn Du in Zeile 12 auf .* prüfst, ist das sowieso falsch, da Du eine Datei nicht mit der Erweiterung * versehen kannst. Die korrigierte Zeile 13 bewirkt durch "%neu%.*", das der REN-Befehl die alte Dateierweiterung beibehält. Du könntest Zeile 11 in
set /p "neu=Bitte neuen Dateinamen für %alt% ohne Erweiterung eingeben: "  
ändern.

Zitat von @Spidi-25:
goto :eof
was bedeutet die zeile?
Das bewirkt einen Rücksprung aus dem Unterprogramm bzw. ein Beenden des Skripts, wenn er im Hauptprogramm ausgeführt wird. EOF ist eine vordefinierte Sprungmarke von CMD.EXE, die nicht angegeben werden muss und immer am Ende des Skripts liegt (EOF=End Of File).

Zitat von @Spidi-25:
muss bei call :ProcessFile immer :ProcessFile drin stehen?
Nein, Du kannst Deine Unterprogramme natürlich nennen wie Du willst. Nur der Doppelpunkt muss immer angegeben werden, da er eine Sprungmarke kennzeichnet. Der Befehl call ProcessFile würde nach einer Batchdatei namens ProcessFile suchen.

Zitat von @Spidi-25:
Könnte man die komplette Liste der Befehle von CMD.exe wie z.B. die For/? Erklärung Drucken?
Ja, einfach
for /? > ForHelp.txt
an der Kommandozeile eingeben. Dann wird die Hilfe von FOR in die Datei ForHelp.txt im aktuell gesetzten Verzeichnis geschrieben.

Übrigens: Der Befehl HELP gibt eine komplette Liste aller CMD-Befehle aus. Mit folgendem Skript kannst Du Dir die Hilfe zu allen CMD-Befehlen in die Datei Help.txt schreiben lassen. Die Datei wird allerdings im ASCII-Format (damit arbeitet CMD) geschrieben, Notepad (arbeitet im ANSI-Format) zeigt die Umlaute falsch an. Zum Schreiben/Betrachten von Batch-Skripten einen Editor verwenden, der im DOS-/ASCII-Format arbeitet. Zur Not EDIT, den alten DOS-Editor von Microsoft, der immer noch in Windows enthalten ist.
@echo off

setlocal

for /f "skip=2" %%h in ('help ^| findstr /b "[A-Z]"') do (  
  call :ProcessCommand "%%h"  
)

endlocal
exit /b


:ProcessCommand
  (echo ***************
   echo * %~1
   echo ***************
   %~1 /?
   echo.
   echo.
   echo.) >> Help.txt
exit /b

Schönen Sonntag ebenfalls!
Dito

Grüße
Friemler

PS:: Schau Dir auch nochmal mein zweites Skript weiter oben an.
bastla
bastla 12.09.2010, aktualisiert am 18.10.2012 um 18:43:26 Uhr
Goto Top
Hallo Spidi-25!

Soferne das mit dem "Drucken" nicht ganz wörtlich gemeint war, sieh Dir mal die beiden folgenden Threads an:
CMD-Befehle auf einen Blick
Wer kann mir alle Batch befele zeigen?
Hinsichtlich der Verwendung von 2 Zeilen für die Eingabe kannst Du das ja etwa so gestalten:
echo Neuen Dateinamen fuer %alt% bitte eingeben:
set /p "neu=               "   
Grüße
bastla
Spidi-25
Spidi-25 12.09.2010 um 22:12:46 Uhr
Goto Top
Hallo

Passt Perfekt Danke!!!

Grüße
Spidi-25