Umbenennen mit Abfrage
Hallo alle zusammen,
bin gerade am üben und verstehen von Batch´s
was stimmt an meinem code nicht, ich bastle eine einfache Umbenennung mit Abfrage!
Grüße
Spidi-25
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 150847
Url: https://administrator.de/forum/umbenennen-mit-abfrage-150847.html
Ausgedruckt am: 25.12.2024 um 06:12 Uhr
13 Kommentare
Neuester Kommentar
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:
Gruß
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 keinif not "!new!"=="" ren usw..
reinmontierst - nicht hübsch Gruß
Hallo Spidi-25!
Zusammen mit dem Beibehalten der Endung könnte die Zeile 6 dann so aussehen:
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:
Grüße
bastla
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!.*"
@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
bastla
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:
Gruß
Friemler
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
@Friemler
Stimmt - wobei ein Name wohl eher etwa "
Eigentlich müsste auch noch der eingegebene neue Name geprüft werden - und dann wäre ich jedenfalls bei VBS angekommen ...
Grüße
bastla
Stimmt - wobei ein Name wohl eher etwa "
%20
" enthält als dass er zB "(^_^).mp3
" lautet ... Eigentlich müsste auch noch der eingegebene neue Name geprüft werden - und dann wäre ich jedenfalls bei VBS angekommen ...
Grüße
bastla
Hallo Spidi-25,
um deine vergessene Extension beim neuen Namen anzufügen kannst du diese Zeile :
In Friemlers Code zwischen den Zeilen 12 und 13 einfügen.
Gruß
LotPings
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"
Gruß
LotPings
Hast Recht, bastla,
hab ich übersehen.
Schönen Sonntag noch!
Gruß
LotPings
hab ich übersehen.
Schönen Sonntag noch!
Gruß
LotPings
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:
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
VBS ist nicht unbedingt notwendig. Die Zeichen ^%& im neuen Dateinamen machen bei meinem Code sowieso keine Probleme. Allerdings dürfen ja die Zeichen
*?:<>|\/"
@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
Hallo Spidi-25,
Zeile 12 kannst Du komplett rauswerfen, dann aber Zeile 13 wieder in
ä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
ändern.
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).
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.
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.
Grüße
Friemler
PS:: Schau Dir auch nochmal mein zweites Skript weiter oben an.
Zeile 12 kannst Du komplett rauswerfen, dann aber Zeile 13 wieder in
if defined neu ren "%alt%" "%neu%.*"
set /p "neu=Bitte neuen Dateinamen für %alt% ohne Erweiterung eingeben: "
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).
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, einfachKönnte man die komplette Liste der Befehle von CMD.exe wie z.B. die For/? Erklärung Drucken?
for /? > ForHelp.txt
Ü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!
DitoGrüße
Friemler
PS:: Schau Dir auch nochmal mein zweites Skript weiter oben an.
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:
Grüße
bastla
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= "
bastla